diff options
author | Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org> | 2015-04-08 19:16:36 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-05-31 19:04:52 +0200 |
commit | d61386a69002be2cff212b03b51411dd294a7a22 (patch) | |
tree | b5b26b8fc6066a552544efee549172d9098081f9 /libavformat | |
parent | 3ad3529b567e04a812c0ff103855ecba3efff900 (diff) | |
download | ffmpeg-d61386a69002be2cff212b03b51411dd294a7a22.tar.gz |
avformat/libquvi: fix error handling
avoid calling cleanup functions on uninitialized variables
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/libquvi.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/libavformat/libquvi.c b/libavformat/libquvi.c index 7c5f7a29b7..7151694542 100644 --- a/libavformat/libquvi.c +++ b/libavformat/libquvi.c @@ -63,28 +63,41 @@ static int libquvi_read_header(AVFormatContext *s) char *media_url, *pagetitle; rc = quvi_init(&q); - if (rc != QUVI_OK) - goto quvi_fail; + if (rc != QUVI_OK) { + av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(q, rc)); + return AVERROR_EXTERNAL; + } quvi_setopt(q, QUVIOPT_FORMAT, qc->format); rc = quvi_parse(q, s->filename, &m); - if (rc != QUVI_OK) - goto quvi_fail; + if (rc != QUVI_OK) { + 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); - if (rc != QUVI_OK) - goto quvi_fail; + if (rc != QUVI_OK) { + 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())) - goto quvi_fail; + if (!(qc->fmtctx = avformat_alloc_context())) { + ret = AVERROR(ENOMEM); + goto err_quvi_cleanup; + } - if ((ret = ff_copy_whitelists(qc->fmtctx, s)) < 0) - goto end; + if ((ret = ff_copy_whitelists(qc->fmtctx, s)) < 0) { + avformat_free_context(qc->fmtctx); + qc->fmtctx = NULL; + goto err_quvi_cleanup; + } ret = avformat_open_input(&qc->fmtctx, media_url, NULL, NULL); if (ret < 0) - goto end; + goto err_quvi_cleanup; rc = quvi_getprop(m, QUVIPROP_PAGETITLE, &pagetitle); if (rc == QUVI_OK) @@ -95,7 +108,7 @@ static int libquvi_read_header(AVFormatContext *s) AVStream *ist = qc->fmtctx->streams[i]; if (!st) { 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); avcodec_copy_context(st->codec, qc->fmtctx->streams[i]->codec); @@ -103,12 +116,11 @@ static int libquvi_read_header(AVFormatContext *s) return 0; -quvi_fail: - av_log(s, AV_LOG_ERROR, "%s\n", quvi_strerror(q, rc)); - ret = AVERROR_EXTERNAL; - -end: + err_close_input: + avformat_close_input(&qc->fmtctx); + err_quvi_cleanup: quvi_parse_close(&m); + err_quvi_close: quvi_close(&q); return ret; } |