[matroska] r1179 - trunk/libebml/src
[email protected] Thu, 19 May 2005 20:37:01 +0400 (MSD)
| Newsgroups | gmane.comp.multimedia.matroska.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: robux4
Date: 2005-05-19 20:37:00 +0400 (Thu, 19 May 2005)
New Revision: 1179
Modified:
trunk/libebml/src/EbmlElement.cpp
Log:
libebml: better check on the max reading size specified and levels
Modified: trunk/libebml/src/EbmlElement.cpp
===================================================================
--- trunk/libebml/src/EbmlElement.cpp 2005-05-19 15:47:11 UTC (rev 1178)
+++ trunk/libebml/src/EbmlElement.cpp 2005-05-19 16:37:00 UTC (rev 1179)
@@ -328,7 +328,7 @@
bool bFound;
int UpperLevel_original = UpperLevel;
- while (1) {
+ do {
// read a potential ID
do {
assert(ReadIndex < 16);
@@ -359,7 +359,7 @@
}
ReadSize++;
- } while (!bFound);
+ } while (!bFound && MaxDataSize > ReadSize);
SizeIdx = ReadIndex;
ReadIndex -= PossibleID_Length;
@@ -382,6 +382,7 @@
ReadSize += DataStream.read(&PossibleIdNSize[SizeIdx++], 1);
PossibleSizeLength++;
}
+
if (bFound) {
// find the element in the context and use the correct creator
EbmlId PossibleID(PossibleIdNSize, PossibleID_Length);
@@ -392,7 +393,12 @@
Result->SetSizeLength(_SizeLength);
Result->Size = SizeFound;
- if (Result->ValidateSize() && (UpperLevel > 0 || MaxDataSize >= SizeFound || MaxDataSize == 0)) {
+ // UpperLevel values
+ // -1 : global element
+ // 0 : child
+ // 1 : same level
+ // + : further parent
+ if (Result->ValidateSize() && (UpperLevel > 0 || MaxDataSize == 0 || MaxDataSize >= (PossibleID_Length + PossibleSizeLength + SizeFound))) {
if (SizeFound == SizeUnknown) {
Result->SetSizeInfinite();
}
@@ -412,7 +418,7 @@
ReadIndex = SizeIdx - 1;
memmove(&PossibleIdNSize[0], &PossibleIdNSize[1], ReadIndex);
UpperLevel = UpperLevel_original;
- }
+ } while ( MaxDataSize > DataStream.getFilePointer() - SizeIdx + PossibleID_Length );
return NULL;
}