diff options
author | Michael Niedermayer <[email protected]> | 2013-01-13 20:44:39 +0100 |
---|---|---|
committer | Carl Eugen Hoyos <[email protected]> | 2013-01-15 21:12:03 +0100 |
commit | dc3349024a06fd3a036ffb2b5243ce20e866bcbf (patch) | |
tree | 10601439dd0955ef61699e5056a8dbdd673fb4f9 | |
parent | 66a3112100083f85ebd3ffbbb992e5fe53b2dfb8 (diff) |
vorbisdec: support freeing partially allocated contexts.
Fixes null pointer derefernces
Signed-off-by: Michael Niedermayer <[email protected]>
(cherry picked from commit 778069c8325514518712d194749577b3451b4125)
-rw-r--r-- | libavcodec/vorbisdec.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c index 45096322f7..3f160544f0 100644 --- a/libavcodec/vorbisdec.c +++ b/libavcodec/vorbisdec.c @@ -195,37 +195,41 @@ static void vorbis_free(vorbis_context *vc) av_freep(&vc->channel_residues); av_freep(&vc->saved); - for (i = 0; i < vc->residue_count; i++) - av_free(vc->residues[i].classifs); + if (vc->residues) + for (i = 0; i < vc->residue_count; i++) + av_free(vc->residues[i].classifs); av_freep(&vc->residues); av_freep(&vc->modes); ff_mdct_end(&vc->mdct[0]); ff_mdct_end(&vc->mdct[1]); - for (i = 0; i < vc->codebook_count; ++i) { - av_free(vc->codebooks[i].codevectors); - ff_free_vlc(&vc->codebooks[i].vlc); - } + if (vc->codebooks) + for (i = 0; i < vc->codebook_count; ++i) { + av_free(vc->codebooks[i].codevectors); + ff_free_vlc(&vc->codebooks[i].vlc); + } av_freep(&vc->codebooks); - for (i = 0; i < vc->floor_count; ++i) { - if (vc->floors[i].floor_type == 0) { - av_free(vc->floors[i].data.t0.map[0]); - av_free(vc->floors[i].data.t0.map[1]); - av_free(vc->floors[i].data.t0.book_list); - av_free(vc->floors[i].data.t0.lsp); - } else { - av_free(vc->floors[i].data.t1.list); + if (vc->floors) + for (i = 0; i < vc->floor_count; ++i) { + if (vc->floors[i].floor_type == 0) { + av_free(vc->floors[i].data.t0.map[0]); + av_free(vc->floors[i].data.t0.map[1]); + av_free(vc->floors[i].data.t0.book_list); + av_free(vc->floors[i].data.t0.lsp); + } else { + av_free(vc->floors[i].data.t1.list); + } } - } av_freep(&vc->floors); - for (i = 0; i < vc->mapping_count; ++i) { - av_free(vc->mappings[i].magnitude); - av_free(vc->mappings[i].angle); - av_free(vc->mappings[i].mux); - } + if (vc->mappings) + for (i = 0; i < vc->mapping_count; ++i) { + av_free(vc->mappings[i].magnitude); + av_free(vc->mappings[i].angle); + av_free(vc->mappings[i].mux); + } av_freep(&vc->mappings); } |