comparison libmpdemux/demux_mkv.c @ 18708:9e2b300db17b

Change free_sh_audio() to take demuxer and stream id as parameters (same as new_sh_audio()) instead of sh_audio_t *, use those to remove the pointer from demuxer->a_streams[] before freeing it. Some demuxers use free_sh_audio() to undo the creation of an already-allocated audio stream in case of error. These uses were unsafe since free_sh_audio() freed the data structure but left the pointer in demuxer->a_streams[], leading to double free later in free_demuxer() (and perhaps use of the freed stream before that, I didn't check).
author uau
date Wed, 14 Jun 2006 14:05:59 +0000
parents 4928dd61f136
children e0077bdf5ee5
comparison
equal deleted inserted replaced
18707:60a60dbf7a88 18708:9e2b300db17b
1835 else 1835 else
1836 { 1836 {
1837 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio " 1837 mp_msg (MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
1838 "codec ID '%s' for track %u or missing/faulty private " 1838 "codec ID '%s' for track %u or missing/faulty private "
1839 "codec data.\n", track->codec_id, track->tnum); 1839 "codec data.\n", track->codec_id, track->tnum);
1840 free_sh_audio (sh_a); 1840 free_sh_audio(demuxer, track->tnum);
1841 return 1; 1841 return 1;
1842 } 1842 }
1843 } 1843 }
1844 1844
1845 sh_a->format = track->a_formattag; 1845 sh_a->format = track->a_formattag;
2059 dp->flags = 0; 2059 dp->flags = 0;
2060 ds_add_packet (demuxer->audio, dp); 2060 ds_add_packet (demuxer->audio, dp);
2061 } 2061 }
2062 else if (!track->ms_compat || (track->private_size < sizeof(WAVEFORMATEX))) 2062 else if (!track->ms_compat || (track->private_size < sizeof(WAVEFORMATEX)))
2063 { 2063 {
2064 free_sh_audio (sh_a); 2064 free_sh_audio(demuxer, track->tnum);
2065 return 1; 2065 return 1;
2066 } 2066 }
2067 2067
2068 return 0; 2068 return 0;
2069 } 2069 }