Commit 59c9e830 authored by Denis Charmet's avatar Denis Charmet

Add try/catch when reading elements with libmatroska.

parent 6053dcfa
......@@ -464,16 +464,24 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( demux_t *p_demux, EbmlS
EbmlElement *p_l0, *p_l1, *p_l2;
bool b_keep_stream = false, b_keep_segment = false;
// verify the EBML Header
p_l0 = p_estream->FindNextID(EBML_INFO(EbmlHead), UINT64_MAX);
/* verify the EBML Header... it shouldn't be bigger than 1kB */
p_l0 = p_estream->FindNextID(EBML_INFO(EbmlHead), 1024);
if (p_l0 == NULL)
{
msg_Err( p_demux, "No EBML header found" );
return NULL;
}
// verify we can read this Segment, we only support Matroska version 1 for now
p_l0->Read(*p_estream, EBML_CLASS_CONTEXT(EbmlHead), i_upper_lvl, p_l0, true);
/* verify we can read this Segment */
try
{
p_l0->Read(*p_estream, EBML_CLASS_CONTEXT(EbmlHead), i_upper_lvl, p_l0, true);
}
catch(...)
{
msg_Err(p_demux, "EBML Header Read failed");
return NULL;
}
EDocType doc_type = GetChild<EDocType>(*static_cast<EbmlHead*>(p_l0));
if (std::string(doc_type) != "matroska" && std::string(doc_type) != "webm" )
......@@ -519,8 +527,15 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( demux_t *p_demux, EbmlS
// find the families of this segment
KaxInfo *p_info = static_cast<KaxInfo*>(p_l1);
b_keep_segment = b_initial;
p_info->Read(*p_estream, EBML_CLASS_CONTEXT(KaxInfo), i_upper_lvl, p_l2, true);
try
{
p_info->Read(*p_estream, EBML_CLASS_CONTEXT(KaxInfo), i_upper_lvl, p_l2, true);
}
catch (...)
{
msg_Err( p_demux, "KaxInfo found but corrupted");
break;
}
for( size_t i = 0; i < p_info->ListSize(); i++ )
{
EbmlElement *l = (*p_info)[i];
......
This diff is collapsed.
......@@ -86,26 +86,33 @@ void matroska_segment_c::ParseSeekHead( KaxSeekHead *seekhead )
msg_Dbg( &sys.demuxer, "| | + Seek" );
#endif
ep->Down();
while( ( l = ep->Get() ) != NULL )
try
{
if( MKV_IS_ID( l, KaxSeekID ) )
while( ( l = ep->Get() ) != NULL )
{
KaxSeekID &sid = *(KaxSeekID*)l;
sid.ReadData( es.I_O() );
id = EbmlId( sid.GetBuffer(), sid.GetSize() );
}
else if( MKV_IS_ID( l, KaxSeekPosition ) )
{
KaxSeekPosition &spos = *(KaxSeekPosition*)l;
spos.ReadData( es.I_O() );
i_pos = (int64_t)segment->GetGlobalPosition( uint64( spos ) );
}
else
{
/* Many mkvmerge files hit this case. It seems to be a broken SeekHead */
msg_Dbg( &sys.demuxer, "| | + Unknown (%s)", typeid(*l).name() );
if( MKV_IS_ID( l, KaxSeekID ) )
{
KaxSeekID &sid = *(KaxSeekID*)l;
sid.ReadData( es.I_O() );
id = EbmlId( sid.GetBuffer(), sid.GetSize() );
}
else if( MKV_IS_ID( l, KaxSeekPosition ) )
{
KaxSeekPosition &spos = *(KaxSeekPosition*)l;
spos.ReadData( es.I_O() );
i_pos = (int64_t)segment->GetGlobalPosition( uint64( spos ) );
}
else
{
/* Many mkvmerge files hit this case. It seems to be a broken SeekHead */
msg_Dbg( &sys.demuxer, "| | + Unknown (%s)", typeid(*l).name() );
}
}
}
catch(...)
{
msg_Err( &sys.demuxer,"Error while reading %s", typeid(*l).name() );
}
ep->Up();
if( i_pos >= 0 )
......@@ -713,7 +720,15 @@ void matroska_segment_c::ParseTracks( KaxTracks *tracks )
int i_upper_level = 0;
/* Master elements */
tracks->Read( es, EBML_CONTEXT(tracks), i_upper_level, el, true );
try
{
tracks->Read( es, EBML_CONTEXT(tracks), i_upper_level, el, true );
}
catch(...)
{
msg_Err( &sys.demuxer, "Couldn't read tracks" );
return;
}
for( size_t i = 0; i < tracks->ListSize(); i++ )
{
......@@ -741,7 +756,15 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
/* Master elements */
m = static_cast<EbmlMaster *>(info);
m->Read( es, EBML_CONTEXT(info), i_upper_level, el, true );
try
{
m->Read( es, EBML_CONTEXT(info), i_upper_level, el, true );
}
catch(...)
{
msg_Err( &sys.demuxer, "Couldn't read info" );
return;
}
for( size_t i = 0; i < m->ListSize(); i++ )
{
......@@ -854,28 +877,35 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
else if( MKV_IS_ID( l, KaxChapterTranslate ) )
{
KaxChapterTranslate *p_trans = static_cast<KaxChapterTranslate*>( l );
chapter_translation_c *p_translate = new chapter_translation_c();
p_trans->Read( es, EBML_CONTEXT(p_trans), i_upper_level, el, true );
for( size_t j = 0; j < p_trans->ListSize(); j++ )
try
{
EbmlElement *l = (*p_trans)[j];
p_trans->Read( es, EBML_CONTEXT(p_trans), i_upper_level, el, true );
chapter_translation_c *p_translate = new chapter_translation_c();
if( MKV_IS_ID( l, KaxChapterTranslateEditionUID ) )
{
p_translate->editions.push_back( uint64( *static_cast<KaxChapterTranslateEditionUID*>( l ) ) );
}
else if( MKV_IS_ID( l, KaxChapterTranslateCodec ) )
{
p_translate->codec_id = uint32( *static_cast<KaxChapterTranslateCodec*>( l ) );
}
else if( MKV_IS_ID( l, KaxChapterTranslateID ) )
for( size_t j = 0; j < p_trans->ListSize(); j++ )
{
p_translate->p_translated = new KaxChapterTranslateID( *static_cast<KaxChapterTranslateID*>( l ) );
EbmlElement *l = (*p_trans)[j];
if( MKV_IS_ID( l, KaxChapterTranslateEditionUID ) )
{
p_translate->editions.push_back( uint64( *static_cast<KaxChapterTranslateEditionUID*>( l ) ) );
}
else if( MKV_IS_ID( l, KaxChapterTranslateCodec ) )
{
p_translate->codec_id = uint32( *static_cast<KaxChapterTranslateCodec*>( l ) );
}
else if( MKV_IS_ID( l, KaxChapterTranslateID ) )
{
p_translate->p_translated = new KaxChapterTranslateID( *static_cast<KaxChapterTranslateID*>( l ) );
}
}
}
translations.push_back( p_translate );
translations.push_back( p_translate );
}
catch(...)
{
msg_Err( &sys.demuxer, "Error while reading Chapter Tranlate");
}
}
else
{
......@@ -1039,7 +1069,15 @@ void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
EbmlElement *el;
int i_upper_level = 0;
attachments->Read( es, EBML_CONTEXT(attachments), i_upper_level, el, true );
try
{
attachments->Read( es, EBML_CONTEXT(attachments), i_upper_level, el, true );
}
catch(...)
{
msg_Err( &sys.demuxer, "Error while reading attachments" );
return;
}
KaxAttached *attachedFile = FindChild<KaxAttached>( *attachments );
......@@ -1089,7 +1127,15 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
int i_upper_level = 0;
/* Master elements */
chapters->Read( es, EBML_CONTEXT(chapters), i_upper_level, el, true );
try
{
chapters->Read( es, EBML_CONTEXT(chapters), i_upper_level, el, true );
}
catch(...)
{
msg_Err( &sys.demuxer, "Error while reading chapters" );
return;
}
for( size_t i = 0; i < chapters->ListSize(); i++ )
{
......@@ -1150,7 +1196,15 @@ void matroska_segment_c::ParseCluster( bool b_update_start_time )
/* Master elements */
m = static_cast<EbmlMaster *>( cluster );
m->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true );
try
{
m->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true );
}
catch(...)
{
msg_Err( &sys.demuxer, "Error while reading cluster" );
return;
}
for( unsigned int i = 0; i < m->ListSize(); i++ )
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment