<div dir="ltr"><span style="font-size:12.8000001907349px">I found a crash when VLC  avcodec.c (/vlc/modules/codec/avcodec/</span><span style="font-size:12.8000001907349px">avcodec.c) call</span><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><b>static int OpenDecoder( vlc_object_t *p_this )</b></font><br></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">OpenDecoder will call:</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><b><font face="monospace, monospace">ret = InitAudioDec( p_dec, avctx, p_codec );</font></b><br></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">InitAudioDec will call <br></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><div><b><font face="monospace, monospace">if( OpenAudioCodec( p_dec ) < 0 )</font></b></div><div><b><font face="monospace, monospace">{</font></b></div><div><b><font face="monospace, monospace">    <font color="#ff0000">av_free( p_context->extradata );</font></font></b></div><div><b><font face="monospace, monospace">    free( p_sys );</font></b></div><div><b><font face="monospace, monospace">    return VLC_EGENERIC;</font></b></div><div><b><font face="monospace, monospace">}</font></b></div></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">if OpenAudioCodec failed VLC will free the buffer of p_context->extradata, and after av_free the p_context->extradata is invalid but the pointer is not NULL</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">but in OpenDecoder function if InitAudioDec failed VLC will call this:</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><div><b><font face="monospace, monospace">    switch( i_cat )</font></b></div><div><b><font face="monospace, monospace">    {</font></b></div><div><b><font face="monospace, monospace">        case VIDEO_ES:</font></b></div><div><b><font face="monospace, monospace">            ret = InitVideoDec( p_dec, avctx, p_codec );</font></b></div><div><b><font face="monospace, monospace">            break;</font></b></div><div><b><font face="monospace, monospace">        case AUDIO_ES:</font></b></div><div><b><font face="monospace, monospace">            ret = InitAudioDec( p_dec, avctx, p_codec );</font></b></div><div><b><font face="monospace, monospace">            break;</font></b></div><div><b><font face="monospace, monospace">        case SPU_ES:</font></b></div><div><b><font face="monospace, monospace">            ret = InitSubtitleDec( p_dec, avctx, p_codec );</font></b></div><div><b><font face="monospace, monospace">            break;</font></b></div><div><b><font face="monospace, monospace">        default:</font></b></div><div><b><font face="monospace, monospace">            ret = VLC_EGENERIC;</font></b></div><div><b><font face="monospace, monospace">    }</font></b></div><div><b><font face="monospace, monospace"><br></font></b></div><div><b><font face="monospace, monospace">    if( ret != VLC_SUCCESS )</font></b></div><div><b><font face="monospace, monospace">    {</font></b></div><div><b><font face="monospace, monospace">        <font color="#ff0000">avcodec_free_context( &avctx );</font></font></b></div><div><b><font face="monospace, monospace">        return ret;</font></b></div><div><b><font face="monospace, monospace">    }</font></b></div></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">in avcodec_free_context will call this:</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><b><font color="#ff0000" face="monospace, monospace">av_freep(&avctx->extradata);</font></b><br></div><div style="font-size:12.8000001907349px"><b><font color="#ff0000" face="monospace, monospace"><br></font></b></div><div style="font-size:12.8000001907349px">in av_freep the extradata is not NULL, but the pointer is invalid.</div><div style="font-size:12.8000001907349px"><font color="#000000" face="arial, helvetica, sans-serif">so, if audio decoder init failed VLC will free extradata two times, and that will cause a crash in sometime.</font></div></div>