Commit bceabbda authored by Lukasz Marek's avatar Lukasz Marek

lavc/libvorbisdec: fix mem leak in case of init failure

Signed-off-by: 's avatarLukasz Marek <lukasz.m.luki2@gmail.com>
parent 96938216
...@@ -35,17 +35,17 @@ typedef struct OggVorbisDecContext { ...@@ -35,17 +35,17 @@ typedef struct OggVorbisDecContext {
static int oggvorbis_decode_init(AVCodecContext *avccontext) { static int oggvorbis_decode_init(AVCodecContext *avccontext) {
OggVorbisDecContext *context = avccontext->priv_data ; OggVorbisDecContext *context = avccontext->priv_data ;
uint8_t *p= avccontext->extradata; uint8_t *p= avccontext->extradata;
int i, hsizes[3]; int i, hsizes[3], ret;
unsigned char *headers[3], *extradata = avccontext->extradata; unsigned char *headers[3], *extradata = avccontext->extradata;
vorbis_info_init(&context->vi) ;
vorbis_comment_init(&context->vc) ;
if(! avccontext->extradata_size || ! p) { if(! avccontext->extradata_size || ! p) {
av_log(avccontext, AV_LOG_ERROR, "vorbis extradata absent\n"); av_log(avccontext, AV_LOG_ERROR, "vorbis extradata absent\n");
return -1; return -1;
} }
vorbis_info_init(&context->vi) ;
vorbis_comment_init(&context->vc) ;
if(p[0] == 0 && p[1] == 30) { if(p[0] == 0 && p[1] == 30) {
for(i = 0; i < 3; i++){ for(i = 0; i < 3; i++){
hsizes[i] = bytestream_get_be16((const uint8_t **)&p); hsizes[i] = bytestream_get_be16((const uint8_t **)&p);
...@@ -65,7 +65,8 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) { ...@@ -65,7 +65,8 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) {
if(offset >= avccontext->extradata_size - 1) { if(offset >= avccontext->extradata_size - 1) {
av_log(avccontext, AV_LOG_ERROR, av_log(avccontext, AV_LOG_ERROR,
"vorbis header sizes damaged\n"); "vorbis header sizes damaged\n");
return -1; ret = -1;
goto error;
} }
hsizes[i] += *p; hsizes[i] += *p;
offset++; offset++;
...@@ -83,7 +84,8 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) { ...@@ -83,7 +84,8 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) {
} else { } else {
av_log(avccontext, AV_LOG_ERROR, av_log(avccontext, AV_LOG_ERROR,
"vorbis initial header len is wrong: %d\n", *p); "vorbis initial header len is wrong: %d\n", *p);
return -1; ret = -1;
goto error;
} }
for(i=0; i<3; i++){ for(i=0; i<3; i++){
...@@ -92,7 +94,8 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) { ...@@ -92,7 +94,8 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) {
context->op.packet = headers[i]; context->op.packet = headers[i];
if(vorbis_synthesis_headerin(&context->vi, &context->vc, &context->op)<0){ if(vorbis_synthesis_headerin(&context->vi, &context->vc, &context->op)<0){
av_log(avccontext, AV_LOG_ERROR, "%d. vorbis header damaged\n", i+1); av_log(avccontext, AV_LOG_ERROR, "%d. vorbis header damaged\n", i+1);
return -1; ret = -1;
goto error;
} }
} }
...@@ -105,6 +108,11 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) { ...@@ -105,6 +108,11 @@ static int oggvorbis_decode_init(AVCodecContext *avccontext) {
vorbis_block_init(&context->vd, &context->vb); vorbis_block_init(&context->vd, &context->vb);
return 0 ; return 0 ;
error:
vorbis_info_clear(&context->vi);
vorbis_comment_clear(&context->vc) ;
return ret;
} }
......
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