Commit 225300b5 authored by Jean-Paul Saman's avatar Jean-Paul Saman

Don't leak memory when filling in p_stream->p_decoder_specific_info for...

Don't leak memory when filling in p_stream->p_decoder_specific_info for subtitles. The p_stream->p_decoder_specific_info pointer was already allocated just before checking for VLC_FOURCC('s','u','b','t'). The fix moves the non-subtitles case to an else.
Signed-off-by: default avatarJean-Paul Saman <jpsaman@videolan.org>
parent c13df5d1
...@@ -892,6 +892,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) ...@@ -892,6 +892,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
int i; int i;
p_input->p_sys = p_stream = malloc( sizeof( ts_stream_t ) ); p_input->p_sys = p_stream = malloc( sizeof( ts_stream_t ) );
if( !p_input->p_sys )
return VLC_ENOMEM;
/* Init this new stream */ /* Init this new stream */
if ( p_sys->b_es_id_pid ) if ( p_sys->b_es_id_pid )
...@@ -1021,6 +1023,13 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) ...@@ -1021,6 +1023,13 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
p_stream->i_langs = 1+p_input->p_fmt->i_extra_languages; p_stream->i_langs = 1+p_input->p_fmt->i_extra_languages;
p_stream->lang = malloc(p_stream->i_langs*3); p_stream->lang = malloc(p_stream->i_langs*3);
if( !p_stream->lang )
{
msg_Err( p_mux, "cannot add new stream, out of memory" );
p_stream->i_langs = 0;
free( p_stream );
return VLC_ENOMEM;
}
i = 1; i = 1;
p_stream->lang[0] = p_stream->lang[0] =
p_stream->lang[1] = p_stream->lang[1] =
...@@ -1085,17 +1094,6 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) ...@@ -1085,17 +1094,6 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
i++; i++;
} }
/* Copy extra data (VOL for MPEG-4 and extra BitMapInfoHeader for VFW */
p_stream->i_decoder_specific_info = p_input->p_fmt->i_extra;
if( p_stream->i_decoder_specific_info > 0 )
{
p_stream->p_decoder_specific_info =
malloc( p_stream->i_decoder_specific_info );
memcpy( p_stream->p_decoder_specific_info,
p_input->p_fmt->p_extra,
p_input->p_fmt->i_extra );
}
/* Create decoder specific info for subt */ /* Create decoder specific info for subt */
if( p_stream->i_codec == VLC_FOURCC( 's', 'u','b', 't' ) ) if( p_stream->i_codec == VLC_FOURCC( 's', 'u','b', 't' ) )
{ {
...@@ -1104,7 +1102,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) ...@@ -1104,7 +1102,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
p_stream->i_decoder_specific_info = 55; p_stream->i_decoder_specific_info = 55;
p_stream->p_decoder_specific_info = p = p_stream->p_decoder_specific_info = p =
malloc( p_stream->i_decoder_specific_info ); malloc( p_stream->i_decoder_specific_info );
if( p )
{
p[0] = 0x10; /* textFormat, 0x10 for 3GPP TS 26.245 */ p[0] = 0x10; /* textFormat, 0x10 for 3GPP TS 26.245 */
p[1] = 0x00; /* flags: 1b: associated video info flag p[1] = 0x00; /* flags: 1b: associated video info flag
3b: reserved 3b: reserved
...@@ -1143,6 +1142,25 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) ...@@ -1143,6 +1142,25 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
*p++ = 9; /* font name length */ *p++ = 9; /* font name length */
memcpy( p, "Helvetica", 9 ); /* font name */ memcpy( p, "Helvetica", 9 ); /* font name */
} }
else p_stream->i_decoder_specific_info = 0;
}
else
{
/* Copy extra data (VOL for MPEG-4 and extra BitMapInfoHeader for VFW */
p_stream->i_decoder_specific_info = p_input->p_fmt->i_extra;
if( p_stream->i_decoder_specific_info > 0 )
{
p_stream->p_decoder_specific_info =
malloc( p_stream->i_decoder_specific_info );
if( p_stream->p_decoder_specific_info )
{
memcpy( p_stream->p_decoder_specific_info,
p_input->p_fmt->p_extra,
p_input->p_fmt->i_extra );
}
else p_stream->i_decoder_specific_info = 0;
}
}
/* Init pes chain */ /* Init pes chain */
BufferChainInit( &p_stream->chain_pes ); BufferChainInit( &p_stream->chain_pes );
...@@ -2233,7 +2251,14 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c ) ...@@ -2233,7 +2251,14 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c )
#endif #endif
if( p_sys->dvbpmt == NULL ) if( p_sys->dvbpmt == NULL )
{
p_sys->dvbpmt = malloc( p_sys->i_num_pmt * sizeof(dvbpsi_pmt_t) ); p_sys->dvbpmt = malloc( p_sys->i_num_pmt * sizeof(dvbpsi_pmt_t) );
if( !p_sys->dvbpmt )
{
msg_Err( p_mux, "cannot generate a new pmt, out of memory" );
return;
}
}
#ifdef HAVE_DVBPSI_SDT #ifdef HAVE_DVBPSI_SDT
if( p_sys->b_sdt ) if( p_sys->b_sdt )
dvbpsi_InitSDT( &sdt, p_sys->i_tsid, 1, 1, p_sys->i_netid ); dvbpsi_InitSDT( &sdt, p_sys->i_tsid, 1, 1, p_sys->i_netid );
......
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