avformat/libquvi: fix error handling

avoid calling cleanup functions on uninitialized variables

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Gilles Chanteperdrix 2015-04-08 19:16:36 +02:00 committed by Michael Niedermayer
parent 3ad3529b56
commit d61386a690
1 changed files with 29 additions and 17 deletions

View File

@ -63,28 +63,41 @@ static int libquvi_read_header(AVFormatContext *s)
char *media_url, *pagetitle; char *media_url, *pagetitle;
rc = quvi_init(&q); rc = quvi_init(&q);
if (rc != QUVI_OK) if (rc != QUVI_OK) {
goto quvi_fail; av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(q, rc));
return AVERROR_EXTERNAL;
}
quvi_setopt(q, QUVIOPT_FORMAT, qc->format); quvi_setopt(q, QUVIOPT_FORMAT, qc->format);
rc = quvi_parse(q, s->filename, &m); rc = quvi_parse(q, s->filename, &m);
if (rc != QUVI_OK) if (rc != QUVI_OK) {
goto quvi_fail; av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(q, rc));
ret = AVERROR_EXTERNAL;
goto err_quvi_close;
}
rc = quvi_getprop(m, QUVIPROP_MEDIAURL, &media_url); rc = quvi_getprop(m, QUVIPROP_MEDIAURL, &media_url);
if (rc != QUVI_OK) if (rc != QUVI_OK) {
goto quvi_fail; av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(q, rc));
ret = AVERROR_EXTERNAL;
goto err_quvi_cleanup;
}
if (!(qc->fmtctx = avformat_alloc_context())) if (!(qc->fmtctx = avformat_alloc_context())) {
goto quvi_fail; ret = AVERROR(ENOMEM);
goto err_quvi_cleanup;
}
if ((ret = ff_copy_whitelists(qc->fmtctx, s)) < 0) if ((ret = ff_copy_whitelists(qc->fmtctx, s)) < 0) {
goto end; avformat_free_context(qc->fmtctx);
qc->fmtctx = NULL;
goto err_quvi_cleanup;
}
ret = avformat_open_input(&qc->fmtctx, media_url, NULL, NULL); ret = avformat_open_input(&qc->fmtctx, media_url, NULL, NULL);
if (ret < 0) if (ret < 0)
goto end; goto err_quvi_cleanup;
rc = quvi_getprop(m, QUVIPROP_PAGETITLE, &pagetitle); rc = quvi_getprop(m, QUVIPROP_PAGETITLE, &pagetitle);
if (rc == QUVI_OK) if (rc == QUVI_OK)
@ -95,7 +108,7 @@ static int libquvi_read_header(AVFormatContext *s)
AVStream *ist = qc->fmtctx->streams[i]; AVStream *ist = qc->fmtctx->streams[i];
if (!st) { if (!st) {
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
goto end; goto err_close_input;
} }
avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den); avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den);
avcodec_copy_context(st->codec, qc->fmtctx->streams[i]->codec); avcodec_copy_context(st->codec, qc->fmtctx->streams[i]->codec);
@ -103,12 +116,11 @@ static int libquvi_read_header(AVFormatContext *s)
return 0; return 0;
quvi_fail: err_close_input:
av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(q, rc)); avformat_close_input(&qc->fmtctx);
ret = AVERROR_EXTERNAL; err_quvi_cleanup:
end:
quvi_parse_close(&m); quvi_parse_close(&m);
err_quvi_close:
quvi_close(&q); quvi_close(&q);
return ret; return ret;
} }