Compare commits
1 Commits
main
...
winstore-a
Author | SHA1 | Date | |
---|---|---|---|
|
271f06853f |
73
ChangeLog
73
ChangeLog
@ -1,76 +1,3 @@
|
|||||||
2016-07-15 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* Replaced the outdated address of the Free Software Foundation
|
|
||||||
with their current one. Fixes #15.
|
|
||||||
|
|
||||||
2016-07-02 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* Released v1.3.4.
|
|
||||||
|
|
||||||
2015-11-21 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* EbmlVersion.cpp: in order to enable deterministic builds the
|
|
||||||
EbmlCodeDate variable has been set to "Unknown" instead of the
|
|
||||||
date and time of compilation. Patch by Ed Schouten <ed@nuxi.nl>.
|
|
||||||
|
|
||||||
2015-11-18 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* libebml_t.h: use C99-style integer typedefs instead of BSD-style
|
|
||||||
ones. Patch by Ed Schouten <ed@nuxi.nl>.
|
|
||||||
|
|
||||||
2015-10-24 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* EbmlBinary.h: add #include <cstdlib> for compilation with clang
|
|
||||||
and libc++. Patch by Thomas Klausner <wiz@NetBSD.org>.
|
|
||||||
|
|
||||||
2015-10-20 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* Released v1.3.3.
|
|
||||||
|
|
||||||
* EbmlMaster::Read(): When the parser encountered a deeply nested
|
|
||||||
element with an infinite size then a following element of an upper
|
|
||||||
level was not propagated correctly. Instead the element with the
|
|
||||||
infinite size was added into the EBML element tree a second time
|
|
||||||
resulting in memory access after freeing it and multiple attempts
|
|
||||||
to free the same memory address during destruction. Fixes the
|
|
||||||
issue reported as Cisco TALOS-CAN-0037.
|
|
||||||
|
|
||||||
* EbmlElement::ReadCodedSizeValue(): Fixed an invalid memory
|
|
||||||
access. When reading a EBML variable length integer value a read
|
|
||||||
access beyond the end of the available buffer was possible if
|
|
||||||
fewer bytes were available than indicated by the first byte
|
|
||||||
resulting in a heap information leak.
|
|
||||||
|
|
||||||
* EbmlUnicodeString::UpdateFromUTF8(): Fixed an invalid memory
|
|
||||||
access. When reading from a UTF-8 string in which the length
|
|
||||||
indicated by a UTF-8 character's first byte exceeds the string's
|
|
||||||
actual number of bytes the parser would access beyond the end of
|
|
||||||
the string resulting in a heap information leak. Fixes the issue
|
|
||||||
reported as Cisco TALOS-CAN-0036.
|
|
||||||
|
|
||||||
2015-10-17 Moritz Bunkus <moritz@bunkus.org>
|
|
||||||
|
|
||||||
* Released v1.3.2.
|
|
||||||
|
|
||||||
2015-08-21 Steve Lhomme <robUx4@gmail.com>
|
|
||||||
|
|
||||||
* EbmlElement::FindNextElement(): Handle EOF when reading the
|
|
||||||
element size properly.
|
|
||||||
|
|
||||||
2015-06-15 Steve Lhomme <robUx4@gmail.com
|
|
||||||
|
|
||||||
* Disable debug code for builds for the Windows App Store.
|
|
||||||
|
|
||||||
2015-06-12 Cristian Morales Vega <reddwarf@opensuse.org>
|
|
||||||
|
|
||||||
* Update the license information: use latest official text for the
|
|
||||||
LGPL.
|
|
||||||
|
|
||||||
2015-02-23 Steve Lhomme <robux4@gmail.com>
|
|
||||||
|
|
||||||
* EbmlString::ValidateSize(): only allow the same maximum size as
|
|
||||||
EbmlBinary.
|
|
||||||
|
|
||||||
2015-01-04 Moritz Bunkus <moritz@bunkus.org>
|
2015-01-04 Moritz Bunkus <moritz@bunkus.org>
|
||||||
|
|
||||||
* Released v1.3.1.
|
* Released v1.3.1.
|
||||||
|
24
README.md
24
README.md
@ -2,27 +2,3 @@
|
|||||||
a C++ libary to parse EBML files
|
a C++ libary to parse EBML files
|
||||||
|
|
||||||
Specifications may be rendered at http://matroska-org.github.io/libebml/
|
Specifications may be rendered at http://matroska-org.github.io/libebml/
|
||||||
|
|
||||||
# Building and installing
|
|
||||||
|
|
||||||
## Building a released version
|
|
||||||
|
|
||||||
libebml is based on autoconf and automake and requires only a C++
|
|
||||||
compiler. This means that the normal build process consists of the
|
|
||||||
usual three steps:
|
|
||||||
|
|
||||||
1. Configuration: `./configure`
|
|
||||||
2. Building: `make`
|
|
||||||
3. Installation (run this as root): `make install`
|
|
||||||
|
|
||||||
## Building from git
|
|
||||||
|
|
||||||
If you're building from git you must have the GNU autotools
|
|
||||||
(`autoconf`, `automake`, `libtoolize`) installed. Then run the
|
|
||||||
following two commands:
|
|
||||||
|
|
||||||
1. `libtoolize`
|
|
||||||
2. `autoreconf -vi`
|
|
||||||
|
|
||||||
Afterwards continue with the steps listed for building a released
|
|
||||||
version.
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libebml], [1.3.4])
|
AC_INIT([libebml], [1.3.1])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
@ -10,5 +10,4 @@ AC_ARG_ENABLE([debug],
|
|||||||
[enable_debug="$withval"], [enable_debug=no])
|
[enable_debug="$withval"], [enable_debug=no])
|
||||||
AM_CONDITIONAL([ENABLE_DEBUG], [test "$enable_debug" = yes])
|
AM_CONDITIONAL([ENABLE_DEBUG], [test "$enable_debug" = yes])
|
||||||
AC_CONFIG_FILES([Makefile libebml.pc])
|
AC_CONFIG_FILES([Makefile libebml.pc])
|
||||||
AC_CHECK_HEADERS([winapifamily.h])
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
#ifndef LIBEBML_BINARY_H
|
#ifndef LIBEBML_BINARY_H
|
||||||
#define LIBEBML_BINARY_H
|
#define LIBEBML_BINARY_H
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#include "EbmlTypes.h"
|
#include "EbmlTypes.h"
|
||||||
|
@ -36,10 +36,6 @@
|
|||||||
#ifndef LIBEBML_CONFIG_H
|
#ifndef LIBEBML_CONFIG_H
|
||||||
#define LIBEBML_CONFIG_H
|
#define LIBEBML_CONFIG_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
@ -104,13 +100,18 @@
|
|||||||
#define LIBEBML_DEBUG
|
#define LIBEBML_DEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_WINAPIFAMILY_H
|
#if defined(_WIN32)||defined(WIN32)
|
||||||
# include <winapifamily.h>
|
#include <winapifamily.h>
|
||||||
# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
||||||
# undef LIBEBML_DEBUG
|
# undef LIBEBML_DEBUG
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// For compilers that don't define __TIMESTAMP__ (e.g. gcc 2.95, gcc 3.2)
|
||||||
|
#ifndef __TIMESTAMP__
|
||||||
|
#define __TIMESTAMP__ __DATE__ " " __TIME__
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define EBML_PRETTYLONGINT(c) (c ## ll)
|
#define EBML_PRETTYLONGINT(c) (c ## ll)
|
||||||
#else // __GNUC__
|
#else // __GNUC__
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
START_LIBEBML_NAMESPACE
|
START_LIBEBML_NAMESPACE
|
||||||
|
|
||||||
#define LIBEBML_VERSION 0x010304
|
#define LIBEBML_VERSION 0x010301
|
||||||
|
|
||||||
extern const std::string EbmlCodeVersion;
|
extern const std::string EbmlCodeVersion;
|
||||||
extern const std::string EbmlCodeDate;
|
extern const std::string EbmlCodeDate;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
**
|
**
|
||||||
** You should have received a copy of the GNU Lesser General Public
|
** You should have received a copy of the GNU Lesser General Public
|
||||||
** License along with this library; if not, write to the Free Software
|
** License along with this library; if not, write to the Free Software
|
||||||
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
**
|
**
|
||||||
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
||||||
**
|
**
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
**
|
**
|
||||||
** You should have received a copy of the GNU Lesser General Public
|
** You should have received a copy of the GNU Lesser General Public
|
||||||
** License along with this library; if not, write to the Free Software
|
** License along with this library; if not, write to the Free Software
|
||||||
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
**
|
**
|
||||||
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
||||||
**
|
**
|
||||||
|
@ -108,10 +108,10 @@ extern "C" {
|
|||||||
typedef int16_t int16;
|
typedef int16_t int16;
|
||||||
typedef int8_t int8;
|
typedef int8_t int8;
|
||||||
typedef int8_t character;
|
typedef int8_t character;
|
||||||
typedef uint64_t uint64;
|
typedef u_int64_t uint64;
|
||||||
typedef uint32_t uint32;
|
typedef u_int32_t uint32;
|
||||||
typedef uint16_t uint16;
|
typedef u_int16_t uint16;
|
||||||
typedef uint8_t uint8;
|
typedef u_int8_t uint8;
|
||||||
#endif /* anything else */
|
#endif /* anything else */
|
||||||
|
|
||||||
typedef uint8 binary;
|
typedef uint8 binary;
|
||||||
|
@ -150,11 +150,6 @@ uint64 ReadCodedSizeValue(const binary * InBuffer, uint32 & BufferSize, uint64 &
|
|||||||
// ID found
|
// ID found
|
||||||
PossibleSizeLength = SizeIdx + 1;
|
PossibleSizeLength = SizeIdx + 1;
|
||||||
SizeBitMask >>= SizeIdx;
|
SizeBitMask >>= SizeIdx;
|
||||||
|
|
||||||
// Guard against invalid memory accesses with incomplete IDs.
|
|
||||||
if (PossibleSizeLength > BufferSize)
|
|
||||||
break;
|
|
||||||
|
|
||||||
for (SizeIdx = 0; SizeIdx < PossibleSizeLength; SizeIdx++) {
|
for (SizeIdx = 0; SizeIdx < PossibleSizeLength; SizeIdx++) {
|
||||||
PossibleSize[SizeIdx] = InBuffer[SizeIdx];
|
PossibleSize[SizeIdx] = InBuffer[SizeIdx];
|
||||||
}
|
}
|
||||||
@ -422,10 +417,7 @@ EbmlElement * EbmlElement::FindNextElement(IOCallback & DataStream, const EbmlSe
|
|||||||
bFound = false;
|
bFound = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( DataStream.read( &PossibleIdNSize[SizeIdx++], 1 ) == 0 ) {
|
ReadSize += DataStream.read(&PossibleIdNSize[SizeIdx++], 1);
|
||||||
return NULL; // no more data ?
|
|
||||||
}
|
|
||||||
ReadSize++;
|
|
||||||
PossibleSizeLength++;
|
PossibleSizeLength++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,118 +398,107 @@ void EbmlMaster::Sort()
|
|||||||
*/
|
*/
|
||||||
void EbmlMaster::Read(EbmlStream & inDataStream, const EbmlSemanticContext & sContext, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt, ScopeMode ReadFully)
|
void EbmlMaster::Read(EbmlStream & inDataStream, const EbmlSemanticContext & sContext, int & UpperEltFound, EbmlElement * & FoundElt, bool AllowDummyElt, ScopeMode ReadFully)
|
||||||
{
|
{
|
||||||
if (ReadFully == SCOPE_NO_DATA)
|
if (ReadFully != SCOPE_NO_DATA)
|
||||||
return;
|
|
||||||
|
|
||||||
EbmlElement * ElementLevelA;
|
|
||||||
// remove all existing elements, including the mandatory ones...
|
|
||||||
size_t Index;
|
|
||||||
for (Index=0; Index<ElementList.size(); Index++) {
|
|
||||||
if (!(*ElementList[Index]).IsLocked()) {
|
|
||||||
delete ElementList[Index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ElementList.clear();
|
|
||||||
uint64 MaxSizeToRead;
|
|
||||||
|
|
||||||
if (IsFiniteSize())
|
|
||||||
MaxSizeToRead = GetSize();
|
|
||||||
else
|
|
||||||
MaxSizeToRead = 0x7FFFFFFF;
|
|
||||||
|
|
||||||
// read blocks and discard the ones we don't care about
|
|
||||||
if (MaxSizeToRead > 0)
|
|
||||||
{
|
{
|
||||||
inDataStream.I_O().setFilePointer(GetSizePosition() + GetSizeLength(), seek_beginning);
|
EbmlElement * ElementLevelA;
|
||||||
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
|
// remove all existing elements, including the mandatory ones...
|
||||||
while (ElementLevelA != NULL && UpperEltFound <= 0 && MaxSizeToRead > 0) {
|
size_t Index;
|
||||||
if (IsFiniteSize() && ElementLevelA->IsFiniteSize())
|
for (Index=0; Index<ElementList.size(); Index++) {
|
||||||
MaxSizeToRead = GetEndPosition() - ElementLevelA->GetEndPosition(); // even if it's the default value
|
if (!(*ElementList[Index]).IsLocked()) {
|
||||||
if (!AllowDummyElt && ElementLevelA->IsDummy()) {
|
delete ElementList[Index];
|
||||||
if (ElementLevelA->IsFiniteSize()) {
|
}
|
||||||
ElementLevelA->SkipData(inDataStream, sContext);
|
}
|
||||||
delete ElementLevelA; // forget this unknown element
|
ElementList.clear();
|
||||||
|
uint64 MaxSizeToRead;
|
||||||
|
|
||||||
|
if (IsFiniteSize())
|
||||||
|
MaxSizeToRead = GetSize();
|
||||||
|
else
|
||||||
|
MaxSizeToRead = 0x7FFFFFFF;
|
||||||
|
|
||||||
|
// read blocks and discard the ones we don't care about
|
||||||
|
if (MaxSizeToRead > 0)
|
||||||
|
{
|
||||||
|
inDataStream.I_O().setFilePointer(GetSizePosition() + GetSizeLength(), seek_beginning);
|
||||||
|
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
|
||||||
|
while (ElementLevelA != NULL && UpperEltFound <= 0 && MaxSizeToRead > 0) {
|
||||||
|
if (IsFiniteSize() && ElementLevelA->IsFiniteSize())
|
||||||
|
MaxSizeToRead = GetEndPosition() - ElementLevelA->GetEndPosition(); // even if it's the default value
|
||||||
|
if (!AllowDummyElt && ElementLevelA->IsDummy()) {
|
||||||
|
if (ElementLevelA->IsFiniteSize()) {
|
||||||
|
ElementLevelA->SkipData(inDataStream, sContext);
|
||||||
|
delete ElementLevelA; // forget this unknown element
|
||||||
|
} else {
|
||||||
|
delete ElementLevelA; // forget this unknown element
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
delete ElementLevelA; // forget this unknown element
|
ElementLevelA->Read(inDataStream, EBML_CONTEXT(ElementLevelA), UpperEltFound, FoundElt, AllowDummyElt, ReadFully);
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ElementLevelA->Read(inDataStream, EBML_CONTEXT(ElementLevelA), UpperEltFound, FoundElt, AllowDummyElt, ReadFully);
|
|
||||||
|
|
||||||
// Discard elements that couldn't be read properly if
|
// Discard elements that couldn't be read properly if
|
||||||
// SCOPE_ALL_DATA has been requested. This can happen
|
// SCOPE_ALL_DATA has been requested. This can happen
|
||||||
// e.g. if block data is defective.
|
// e.g. if block data is defective.
|
||||||
bool DeleteElement = true;
|
bool DeleteElement = true;
|
||||||
|
|
||||||
if (ElementLevelA->ValueIsSet() || (ReadFully != SCOPE_ALL_DATA)) {
|
if (ElementLevelA->ValueIsSet() || (ReadFully != SCOPE_ALL_DATA)) {
|
||||||
ElementList.push_back(ElementLevelA);
|
ElementList.push_back(ElementLevelA);
|
||||||
DeleteElement = false;
|
DeleteElement = false;
|
||||||
}
|
|
||||||
|
|
||||||
// just in case
|
|
||||||
if (ElementLevelA->IsFiniteSize()) {
|
|
||||||
ElementLevelA->SkipData(inDataStream, EBML_CONTEXT(ElementLevelA));
|
|
||||||
if (DeleteElement)
|
|
||||||
delete ElementLevelA;
|
|
||||||
} else {
|
|
||||||
if (DeleteElement)
|
|
||||||
delete ElementLevelA;
|
|
||||||
|
|
||||||
if (UpperEltFound) {
|
|
||||||
--UpperEltFound;
|
|
||||||
if (UpperEltFound > 0 || MaxSizeToRead <= 0)
|
|
||||||
goto processCrc;
|
|
||||||
ElementLevelA = FoundElt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
// just in case
|
||||||
|
if (ElementLevelA->IsFiniteSize()) {
|
||||||
|
ElementLevelA->SkipData(inDataStream, EBML_CONTEXT(ElementLevelA));
|
||||||
|
if (DeleteElement)
|
||||||
|
delete ElementLevelA;
|
||||||
|
} else {
|
||||||
|
if (DeleteElement)
|
||||||
|
delete ElementLevelA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
if (UpperEltFound > 0) {
|
||||||
|
UpperEltFound--;
|
||||||
|
if (UpperEltFound > 0 || MaxSizeToRead <= 0)
|
||||||
|
goto processCrc;
|
||||||
|
ElementLevelA = FoundElt;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpperEltFound < 0) {
|
||||||
|
UpperEltFound++;
|
||||||
|
if (UpperEltFound < 0)
|
||||||
|
goto processCrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MaxSizeToRead <= 0)
|
||||||
|
goto processCrc;// this level is finished
|
||||||
|
|
||||||
|
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
|
||||||
|
}
|
||||||
if (UpperEltFound > 0) {
|
if (UpperEltFound > 0) {
|
||||||
UpperEltFound--;
|
FoundElt = ElementLevelA;
|
||||||
if (UpperEltFound > 0 || MaxSizeToRead <= 0)
|
|
||||||
goto processCrc;
|
|
||||||
ElementLevelA = FoundElt;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (UpperEltFound < 0) {
|
processCrc:
|
||||||
UpperEltFound++;
|
EBML_MASTER_ITERATOR Itr, CrcItr;
|
||||||
if (UpperEltFound < 0)
|
for (Itr = ElementList.begin(); Itr != ElementList.end();) {
|
||||||
goto processCrc;
|
if ((EbmlId)(*(*Itr)) == EBML_ID(EbmlCrc32)) {
|
||||||
|
bChecksumUsed = true;
|
||||||
|
// remove the element
|
||||||
|
Checksum = *(static_cast<EbmlCrc32*>(*Itr));
|
||||||
|
CrcItr = Itr;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
++Itr;
|
||||||
if (MaxSizeToRead <= 0)
|
|
||||||
goto processCrc;// this level is finished
|
|
||||||
|
|
||||||
ElementLevelA = inDataStream.FindNextElement(sContext, UpperEltFound, MaxSizeToRead, AllowDummyElt);
|
|
||||||
}
|
|
||||||
if (UpperEltFound > 0) {
|
|
||||||
FoundElt = ElementLevelA;
|
|
||||||
}
|
}
|
||||||
|
if (bChecksumUsed)
|
||||||
|
{
|
||||||
|
delete *CrcItr;
|
||||||
|
Remove(CrcItr);
|
||||||
|
}
|
||||||
|
SetValueIsSet();
|
||||||
}
|
}
|
||||||
processCrc:
|
|
||||||
|
|
||||||
EBML_MASTER_ITERATOR Itr, CrcItr;
|
|
||||||
for (Itr = ElementList.begin(); Itr != ElementList.end();) {
|
|
||||||
if ((EbmlId)(*(*Itr)) == EBML_ID(EbmlCrc32)) {
|
|
||||||
bChecksumUsed = true;
|
|
||||||
// remove the element
|
|
||||||
Checksum = *(static_cast<EbmlCrc32*>(*Itr));
|
|
||||||
CrcItr = Itr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++Itr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bChecksumUsed)
|
|
||||||
{
|
|
||||||
delete *CrcItr;
|
|
||||||
Remove(CrcItr);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetValueIsSet();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EbmlMaster::Remove(size_t Index)
|
void EbmlMaster::Remove(size_t Index)
|
||||||
|
@ -47,21 +47,6 @@ START_LIBEBML_NAMESPACE
|
|||||||
|
|
||||||
// ===================== UTFstring class ===================
|
// ===================== UTFstring class ===================
|
||||||
|
|
||||||
static unsigned int UTFCharLength(uint8 lead)
|
|
||||||
{
|
|
||||||
if (lead < 0x80)
|
|
||||||
return 1;
|
|
||||||
else if ((lead >> 5) == 0x6)
|
|
||||||
return 2;
|
|
||||||
else if ((lead >> 4) == 0xe)
|
|
||||||
return 3;
|
|
||||||
else if ((lead >> 3) == 0x1e)
|
|
||||||
return 4;
|
|
||||||
else
|
|
||||||
// Invalid size?
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
UTFstring::UTFstring()
|
UTFstring::UTFstring()
|
||||||
:_Length(0)
|
:_Length(0)
|
||||||
,_Data(NULL)
|
,_Data(NULL)
|
||||||
@ -158,39 +143,39 @@ void UTFstring::UpdateFromUTF8()
|
|||||||
delete [] _Data;
|
delete [] _Data;
|
||||||
// find the size of the final UCS-2 string
|
// find the size of the final UCS-2 string
|
||||||
size_t i;
|
size_t i;
|
||||||
const size_t SrcLength = UTF8string.length();
|
for (_Length=0, i=0; i<UTF8string.length(); _Length++) {
|
||||||
for (_Length=0, i=0; i<SrcLength; _Length++) {
|
uint8 lead = static_cast<uint8>(UTF8string[i]);
|
||||||
const unsigned int CharLength = UTFCharLength(static_cast<uint8>(UTF8string[i]));
|
if (lead < 0x80)
|
||||||
if ((CharLength >= 1) && (CharLength <= 4))
|
i++;
|
||||||
i += CharLength;
|
else if ((lead >> 5) == 0x6)
|
||||||
|
i += 2;
|
||||||
|
else if ((lead >> 4) == 0xe)
|
||||||
|
i += 3;
|
||||||
|
else if ((lead >> 3) == 0x1e)
|
||||||
|
i += 4;
|
||||||
else
|
else
|
||||||
// Invalid size?
|
// Invalid size?
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_Data = new wchar_t[_Length+1];
|
_Data = new wchar_t[_Length+1];
|
||||||
size_t j;
|
size_t j;
|
||||||
for (j=0, i=0; i<SrcLength; j++) {
|
for (j=0, i=0; i<UTF8string.length(); j++) {
|
||||||
const uint8 lead = static_cast<uint8>(UTF8string[i]);
|
uint8 lead = static_cast<uint8>(UTF8string[i]);
|
||||||
const unsigned int CharLength = UTFCharLength(lead);
|
if (lead < 0x80) {
|
||||||
if ((CharLength < 1) || (CharLength > 4))
|
_Data[j] = lead;
|
||||||
|
i++;
|
||||||
|
} else if ((lead >> 5) == 0x6) {
|
||||||
|
_Data[j] = ((lead & 0x1F) << 6) + (UTF8string[i+1] & 0x3F);
|
||||||
|
i += 2;
|
||||||
|
} else if ((lead >> 4) == 0xe) {
|
||||||
|
_Data[j] = ((lead & 0x0F) << 12) + ((UTF8string[i+1] & 0x3F) << 6) + (UTF8string[i+2] & 0x3F);
|
||||||
|
i += 3;
|
||||||
|
} else if ((lead >> 3) == 0x1e) {
|
||||||
|
_Data[j] = ((lead & 0x07) << 18) + ((UTF8string[i+1] & 0x3F) << 12) + ((UTF8string[i+2] & 0x3F) << 6) + (UTF8string[i+3] & 0x3F);
|
||||||
|
i += 4;
|
||||||
|
} else
|
||||||
// Invalid char?
|
// Invalid char?
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if ((i + CharLength) > SrcLength)
|
|
||||||
// Guard against invalid memory access beyond the end of the
|
|
||||||
// source buffer.
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (CharLength == 1)
|
|
||||||
_Data[j] = lead;
|
|
||||||
else if (CharLength == 2)
|
|
||||||
_Data[j] = ((lead & 0x1F) << 6) + (UTF8string[i+1] & 0x3F);
|
|
||||||
else if (CharLength == 3)
|
|
||||||
_Data[j] = ((lead & 0x0F) << 12) + ((UTF8string[i+1] & 0x3F) << 6) + (UTF8string[i+2] & 0x3F);
|
|
||||||
else if (CharLength == 4)
|
|
||||||
_Data[j] = ((lead & 0x07) << 18) + ((UTF8string[i+1] & 0x3F) << 12) + ((UTF8string[i+2] & 0x3F) << 6) + (UTF8string[i+3] & 0x3F);
|
|
||||||
|
|
||||||
i += CharLength;
|
|
||||||
}
|
}
|
||||||
_Data[j] = 0;
|
_Data[j] = 0;
|
||||||
}
|
}
|
||||||
|
@ -38,11 +38,7 @@
|
|||||||
|
|
||||||
START_LIBEBML_NAMESPACE
|
START_LIBEBML_NAMESPACE
|
||||||
|
|
||||||
const std::string EbmlCodeVersion = "1.3.4";
|
const std::string EbmlCodeVersion = "1.3.1";
|
||||||
|
const std::string EbmlCodeDate = __TIMESTAMP__;
|
||||||
// Up to version 1.3.3 this library exported a build date string. As
|
|
||||||
// this made the build non-reproducible, replace it by a placeholder to
|
|
||||||
// remain API compatible.
|
|
||||||
const std::string EbmlCodeDate = "Unknown";
|
|
||||||
|
|
||||||
END_LIBEBML_NAMESPACE
|
END_LIBEBML_NAMESPACE
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
**
|
**
|
||||||
** You should have received a copy of the GNU Lesser General Public
|
** You should have received a copy of the GNU Lesser General Public
|
||||||
** License along with this library; if not, write to the Free Software
|
** License along with this library; if not, write to the Free Software
|
||||||
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
**
|
**
|
||||||
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
||||||
**
|
**
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
**
|
**
|
||||||
** You should have received a copy of the GNU Lesser General Public
|
** You should have received a copy of the GNU Lesser General Public
|
||||||
** License along with this library; if not, write to the Free Software
|
** License along with this library; if not, write to the Free Software
|
||||||
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
**
|
**
|
||||||
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.
|
||||||
**
|
**
|
||||||
|
Loading…
Reference in New Issue
Block a user