[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;
 }