mkvparser: avoid rollover in UnserializeInt().
- Not strictly rollover-- avoid exceeding max 64 EBML (2^26 - 2). - Tidy up the function. BUG=23321923 Change-Id: I172c75064c189ed0fcf224145d016fca421f60c6
This commit is contained in:
@@ -17,6 +17,10 @@
|
|||||||
#pragma warning(disable : 4996)
|
#pragma warning(disable : 4996)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
const long long kMaxEbmlSigned64Bit = (1LL << 56) - 2;
|
||||||
|
}
|
||||||
|
|
||||||
mkvparser::IMkvReader::~IMkvReader() {}
|
mkvparser::IMkvReader::~IMkvReader() {}
|
||||||
|
|
||||||
void mkvparser::GetVersion(int& major, int& minor, int& build, int& revision) {
|
void mkvparser::GetVersion(int& major, int& minor, int& build, int& revision) {
|
||||||
@@ -220,24 +224,20 @@ long mkvparser::UnserializeFloat(IMkvReader* pReader, long long pos,
|
|||||||
}
|
}
|
||||||
|
|
||||||
long mkvparser::UnserializeInt(IMkvReader* pReader, long long pos,
|
long mkvparser::UnserializeInt(IMkvReader* pReader, long long pos,
|
||||||
long long size, long long& result) {
|
long long size, long long& result_ref) {
|
||||||
assert(pReader);
|
assert(pReader);
|
||||||
assert(pos >= 0);
|
assert(pos >= 0);
|
||||||
assert(size > 0);
|
assert(size > 0);
|
||||||
assert(size <= 8);
|
assert(size <= 8);
|
||||||
|
|
||||||
{
|
char first_byte = 0;
|
||||||
signed char b;
|
const long status = pReader->Read(pos, 1, (unsigned char*)&first_byte);
|
||||||
|
|
||||||
const long status = pReader->Read(pos, 1, (unsigned char*)&b);
|
if (status < 0)
|
||||||
|
return status;
|
||||||
|
|
||||||
if (status < 0)
|
unsigned long long result = first_byte;
|
||||||
return status;
|
++pos;
|
||||||
|
|
||||||
result = b;
|
|
||||||
|
|
||||||
++pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (long i = 1; i < size; ++i) {
|
for (long i = 1; i < size; ++i) {
|
||||||
unsigned char b;
|
unsigned char b;
|
||||||
@@ -253,7 +253,11 @@ long mkvparser::UnserializeInt(IMkvReader* pReader, long long pos,
|
|||||||
++pos;
|
++pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; // success
|
if (result > kMaxEbmlSigned64Bit)
|
||||||
|
return E_FILE_FORMAT_INVALID;
|
||||||
|
|
||||||
|
result_ref = static_cast<long long>(result);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
long mkvparser::UnserializeString(IMkvReader* pReader, long long pos,
|
long mkvparser::UnserializeString(IMkvReader* pReader, long long pos,
|
||||||
|
|||||||
Reference in New Issue
Block a user