vlc | branch: master | Denis Charmet <[email protected]> | Sun Sep 18 23:53:26 2011 +0200| [ad2446286fba9f93012312d72a89134674bf7b7e] | committer: Jean-Baptiste Kempf
Handle mkv file with random data appended EbmlElement doesn't detect EOF so we don't try to look for more than the file size. Close #5287 Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ad2446286fba9f93012312d72a89134674bf7b7e --- modules/demux/mkv/Ebml_parser.cpp | 8 +++++--- modules/demux/mkv/stream_io_callback.cpp | 15 +++++++++++++++ modules/demux/mkv/stream_io_callback.hpp | 1 + 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/modules/demux/mkv/Ebml_parser.cpp b/modules/demux/mkv/Ebml_parser.cpp index 8abe76c..cd81d8d 100644 --- a/modules/demux/mkv/Ebml_parser.cpp +++ b/modules/demux/mkv/Ebml_parser.cpp @@ -24,6 +24,7 @@ *****************************************************************************/ #include "Ebml_parser.hpp" +#include "stream_io_callback.hpp" /***************************************************************************** * Ebml Stream parser @@ -77,7 +78,7 @@ EbmlElement* EbmlParser::UnGet( uint64 i_block_pos, uint64 i_cluster_pos ) } m_got = NULL; mb_keep = false; - if ( m_el[1]->GetElementPosition() == i_cluster_pos ) + if ( m_el[1] && m_el[1]->GetElementPosition() == i_cluster_pos ) { m_es->I_O().setFilePointer( i_block_pos, seek_beginning ); return (EbmlMaster*) m_el[1]; @@ -161,8 +162,9 @@ EbmlElement *EbmlParser::Get( void ) } mb_keep = false; } - - m_el[mi_level] = m_es->FindNextElement( EBML_CONTEXT(m_el[mi_level - 1]), i_ulev, 0xFFFFFFFFL, mb_dummy != 0, 1 ); + vlc_stream_io_callback & io_stream = (vlc_stream_io_callback &) m_es->I_O(); + uint64 i_size = io_stream.toRead(); + m_el[mi_level] = m_es->FindNextElement( EBML_CONTEXT(m_el[mi_level - 1]), i_ulev, i_size, mb_dummy != 0, 1 ); // mi_remain_size[mi_level] = m_el[mi_level]->GetSize(); if( i_ulev > 0 ) { diff --git a/modules/demux/mkv/stream_io_callback.cpp b/modules/demux/mkv/stream_io_callback.cpp index ae3cd8f..2fff1ef 100644 --- a/modules/demux/mkv/stream_io_callback.cpp +++ b/modules/demux/mkv/stream_io_callback.cpp @@ -87,3 +87,18 @@ size_t vlc_stream_io_callback::write(const void *, size_t ) return 0; } +uint64 vlc_stream_io_callback::toRead( void ) +{ + uint64_t i_size; + + if( s == NULL) + return 0; + + stream_Control( s, STREAM_GET_SIZE, &i_size ); + + if( i_size == 0 ) + return 0xFFFFFFFFL; + + return (uint64) i_size - stream_Tell( s ); +} + diff --git a/modules/demux/mkv/stream_io_callback.hpp b/modules/demux/mkv/stream_io_callback.hpp index c67faeb..11566da 100644 --- a/modules/demux/mkv/stream_io_callback.hpp +++ b/modules/demux/mkv/stream_io_callback.hpp @@ -47,5 +47,6 @@ class vlc_stream_io_callback: public IOCallback virtual size_t write ( const void *p_buffer, size_t i_size); virtual uint64 getFilePointer ( void ); virtual void close ( void ) { return; } + uint64 toRead ( void ); }; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
