]> git.sesse.net Git - vlc/commitdiff
Handle mkv file with random data appended
authorDenis Charmet <typx@dinauz.org>
Sun, 18 Sep 2011 21:53:26 +0000 (23:53 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Wed, 21 Sep 2011 00:14:40 +0000 (02:14 +0200)
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 <jb@videolan.org>
modules/demux/mkv/Ebml_parser.cpp
modules/demux/mkv/stream_io_callback.cpp
modules/demux/mkv/stream_io_callback.hpp

index 8abe76c138cbcb9b0cc664b5d6ed7aae2cf2090c..cd81d8de9f14c21e21762372eab3610bb702adcf 100644 (file)
@@ -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 )
     {
index ae3cd8f5d706cedbdb00ae0567bf37c0917421ca..2fff1ef76da356fc0292e95e58c2b018bb41e6e1 100644 (file)
@@ -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 );
+}
+
index c67faeb838e4ec504cdc5a83d0d264594c766e14..11566daa034958cdd463499093afa16c59185225 100644 (file)
@@ -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 );
 };