mkvparser: validate results in EBMLHeader::Parse.
Return an error when DocType, DocTypeReadVersion, DocTypeVersion EBMLMaxIDLength or EBMLMaxSizeLength are invalid or cannot be handled by mkvparser. Update samples to respect the return value from EBMLHeader::Parse. BUG=https://code.google.com/p/webm/issues/detail?id=1057 Change-Id: I9337f13c1d5fa366b1101e48fe6bc46eb5b2ee97
This commit is contained in:
@@ -630,6 +630,15 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) {
|
|||||||
if (pos != end)
|
if (pos != end)
|
||||||
return E_FILE_FORMAT_INVALID;
|
return E_FILE_FORMAT_INVALID;
|
||||||
|
|
||||||
|
// Make sure DocType, DocTypeReadVersion, and DocTypeVersion are valid.
|
||||||
|
if (m_docType == NULL || m_docTypeReadVersion <= 0 || m_docTypeVersion <= 0)
|
||||||
|
return E_FILE_FORMAT_INVALID;
|
||||||
|
|
||||||
|
// Make sure EBMLMaxIDLength and EBMLMaxSizeLength are valid.
|
||||||
|
if (m_maxIdLength <= 0 || m_maxIdLength > 4 ||
|
||||||
|
m_maxSizeLength <= 0 || m_maxSizeLength > 8)
|
||||||
|
return E_FILE_FORMAT_INVALID;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,11 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
EBMLHeader ebmlHeader;
|
EBMLHeader ebmlHeader;
|
||||||
|
|
||||||
ebmlHeader.Parse(&reader, pos);
|
long long ret = ebmlHeader.Parse(&reader, pos);
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("\n EBMLHeader::Parse() failed.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
printf("\t\t\t EBML Header\n");
|
printf("\t\t\t EBML Header\n");
|
||||||
printf("\t\tEBML Version\t\t: %lld\n", ebmlHeader.m_version);
|
printf("\t\tEBML Version\t\t: %lld\n", ebmlHeader.m_version);
|
||||||
@@ -95,7 +99,7 @@ int main(int argc, char* argv[]) {
|
|||||||
typedef mkvparser::Segment seg_t;
|
typedef mkvparser::Segment seg_t;
|
||||||
seg_t* pSegment_;
|
seg_t* pSegment_;
|
||||||
|
|
||||||
long long ret = seg_t::CreateInstance(&reader, pos, pSegment_);
|
ret = seg_t::CreateInstance(&reader, pos, pSegment_);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printf("\n Segment::CreateInstance() failed.");
|
printf("\n Segment::CreateInstance() failed.");
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -248,11 +248,14 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
long long pos = 0;
|
long long pos = 0;
|
||||||
mkvparser::EBMLHeader ebml_header;
|
mkvparser::EBMLHeader ebml_header;
|
||||||
ebml_header.Parse(&reader, pos);
|
long long ret = ebml_header.Parse(&reader, pos);
|
||||||
|
if (ret) {
|
||||||
|
printf("\n EBMLHeader::Parse() failed.");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
mkvparser::Segment* parser_segment_;
|
mkvparser::Segment* parser_segment_;
|
||||||
long long ret =
|
ret = mkvparser::Segment::CreateInstance(&reader, pos, parser_segment_);
|
||||||
mkvparser::Segment::CreateInstance(&reader, pos, parser_segment_);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printf("\n Segment::CreateInstance() failed.");
|
printf("\n Segment::CreateInstance() failed.");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ bool vttdemux::ParseHeader(mkvparser::IMkvReader* reader, mkvpos_t* pos) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(h.m_docType, "webm") != 0) {
|
if (h.m_docType == NULL || strcmp(h.m_docType, "webm") != 0) {
|
||||||
printf("bad doctype\n");
|
printf("bad doctype\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user