]> git.sesse.net Git - vlc/blobdiff - modules/demux/real.c
check for fcntl()
[vlc] / modules / demux / real.c
index 36084c689c036b253293e9ea6162d86104f22dc7..8d6fa6c17f5476f9ac18599d67351d4417a83ac5 100644 (file)
@@ -66,7 +66,7 @@ static void Close  ( vlc_object_t * );
 
 vlc_module_begin();
     set_description( N_("Real demuxer" ) );
-    set_capability( "demux", 15 );
+    set_capability( "demux", 0 );
     set_category( CAT_INPUT );
     set_subcategory( SUBCAT_INPUT_DEMUX );
     set_callbacks( Open, Close );
@@ -269,7 +269,8 @@ static int Demux( demux_t *p_demux )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
     uint8_t     header[18];
-    int         i_size, i_id, i_flags, i;
+    int         i_id, i_flags, i;
+    unsigned int i_size;
     int64_t     i_pts;
     real_track_t *tk = NULL;
     bool  b_selected;
@@ -310,6 +311,18 @@ static int Demux( demux_t *p_demux )
 
     p_sys->i_data_packets++;
 
+    if( i_size == 0 )
+    {
+        msg_Err( p_demux, "Got a NUKK size to read. (Invalid format?)" );
+        return 1;
+    }
+
+    if( i_size > sizeof(p_sys->buffer) )
+    {
+        msg_Err( p_demux, "Got a size to read bigger than our buffer. (Invalid format?)" );
+        return 1;
+    }
+
     stream_Read( p_demux->s, p_sys->buffer, i_size );
 
     for( i = 0; i < p_sys->i_track; i++ )
@@ -781,7 +794,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                 msg_Dbg(p_demux, "Seek in real rtsp stream!");
                 p_sys->i_pcr = (int64_t)1000 * ( p_sys->i_our_duration * f  );
 
-                es_out_Control( p_demux->out, ES_OUT_RESET_PCR , p_sys->i_pcr );
                 p_sys->b_seek = 1;
 
                 return stream_Seek( p_demux->s, p_sys->i_pcr );
@@ -806,8 +818,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 
                 p_sys->i_pcr = 1000 * (int64_t) p_index->time_offset;
 
-                es_out_Control( p_demux->out, ES_OUT_RESET_PCR , p_sys->i_pcr );
-
                 return stream_Seek( p_demux->s, i64 );
             }
         case DEMUX_SET_TIME:
@@ -827,7 +837,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             }
 
             p_sys->i_pcr = 1000 * (int64_t) p_index->time_offset;
-            es_out_Control( p_demux->out, ES_OUT_RESET_PCR , p_sys->i_pcr );
 
             return stream_Seek( p_demux->s, i64 );
 
@@ -1478,6 +1487,8 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num )
             msg_Dbg( p_demux, "        - extra data=%d", fmt.i_extra );
 
             tk = malloc( sizeof( real_track_t ) );
+            if( !tk )
+                return VLC_ENOMEM;
             tk->i_id = i_num;
             tk->fmt = fmt;
             tk->i_frame = 0;
@@ -1514,9 +1525,11 @@ static int ReadCodecSpecificData( demux_t *p_demux, int i_len, int i_num )
             }
 
             /* Check if the calloc went correctly */
-            if( tk->p_subpackets == NULL )
+            if( !tk->p_subpackets && !tk->p_subpackets_timecode)
             {
-                tk->i_subpackets = 0;
+                free( tk->p_subpackets_timecode );
+                free( tk->p_subpackets );
+                free( tk );
                 msg_Err( p_demux, "Can't alloc subpacket" );
                 return VLC_EGENERIC;
             }