]> git.sesse.net Git - vlc/commitdiff
demux: avi: handle zero sized lists (fix #9056, fix #8413)
authorFrancois Cartegnie <fcvlcdev@free.fr>
Sat, 24 Aug 2013 08:22:53 +0000 (10:22 +0200)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Sat, 24 Aug 2013 10:27:49 +0000 (12:27 +0200)
modules/demux/avi/libavi.c
modules/demux/avi/libavi.h

index c09175f47f51193f31571983dbfade4d5408331a..43db2e5b4598793dccbe213aaf4cdf9a68110046 100644 (file)
@@ -112,6 +112,7 @@ static int AVI_ChunkRead_list( stream_t *s, avi_chunk_t *p_container )
     avi_chunk_t *p_chk;
     const uint8_t *p_peek;
     bool b_seekable;
+    int i_ret = VLC_SUCCESS;
 
     if( p_container->common.i_chunk_size > 0 && p_container->common.i_chunk_size < 4 )
     {
@@ -173,7 +174,7 @@ static int AVI_ChunkRead_list( stream_t *s, avi_chunk_t *p_container )
         }
         p_container->common.p_last = p_chk;
 
-        if( AVI_ChunkRead( s, p_chk, p_container ) )
+        if( i_ret = AVI_ChunkRead( s, p_chk, p_container ) )
         {
             break;
         }
@@ -196,6 +197,7 @@ static int AVI_ChunkRead_list( stream_t *s, avi_chunk_t *p_container )
     }
     msg_Dbg( (vlc_object_t*)s, "</list \'%4.4s\'>", (char*)&p_container->list.i_type );
 
+    if ( i_ret == AVI_ZERO_FOURCC ) return i_ret;
     return VLC_SUCCESS;
 }
 
@@ -831,7 +833,7 @@ int  AVI_ChunkRead( stream_t *s, avi_chunk_t *p_chk, avi_chunk_t *p_father )
     if( p_chk->common.i_chunk_fourcc == VLC_FOURCC( 0, 0, 0, 0 ) )
     {
         msg_Warn( (vlc_object_t*)s, "found null fourcc chunk (corrupted file?)" );
-        return VLC_EGENERIC;
+        return AVI_ZERO_FOURCC;
     }
     p_chk->common.p_father = p_father;
 
@@ -839,7 +841,7 @@ int  AVI_ChunkRead( stream_t *s, avi_chunk_t *p_chk, avi_chunk_t *p_father )
     if( AVI_Chunk_Function[i_index].AVI_ChunkRead_function )
     {
         int i_return = AVI_Chunk_Function[i_index].AVI_ChunkRead_function( s, p_chk );
-        if ( i_return == AVI_STRD_ZERO_CHUNK )
+        if ( i_return == AVI_STRD_ZERO_CHUNK || i_return == AVI_ZERO_FOURCC )
         {
             if ( !p_father ) return VLC_EGENERIC;
             return AVI_NextChunk( s, p_father );
index 1ef830cb15af4c59ade3c41ab8c673f4e9895ded..4ae9aa6579f0864ed5361fa4eb83d20609d08bbe 100644 (file)
@@ -179,6 +179,7 @@ typedef struct avi_chunk_dmlh_s
 } avi_chunk_dmlh_t;
 
 #define AVI_STRD_ZERO_CHUNK     0xFF
+#define AVI_ZERO_FOURCC         0xFE
 
 #define AVI_INDEX_OF_INDEXES    0x00
 #define AVI_INDEX_OF_CHUNKS     0x01