diff options
author | Clément Bœsch <u@pkh.me> | 2016-06-25 11:42:57 +0200 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2016-06-25 11:42:57 +0200 |
commit | 2ab823d4a6ef1f96961a82fcf5100a5a46917d0e (patch) | |
tree | d2a4ddcd3810ff9c6b811e1e0973987a593c647f | |
parent | 63ac806ccb751bc5aadf70b7fc50a603968c4338 (diff) | |
parent | d68fb1475856cf93199e2bc4eee3063902c35df7 (diff) | |
download | ffmpeg-2ab823d4a6ef1f96961a82fcf5100a5a46917d0e.tar.gz |
Merge commit 'd68fb1475856cf93199e2bc4eee3063902c35df7'
* commit 'd68fb1475856cf93199e2bc4eee3063902c35df7':
mjpegdec: Properly fail on malloc failure
Merged-by: Clément Bœsch <u@pkh.me>
-rw-r--r-- | libavcodec/mjpegdec.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index d77332905c..633a8f02c0 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -1876,34 +1876,35 @@ static int mjpeg_decode_com(MJpegDecodeContext *s) { int len = get_bits(&s->gb, 16); if (len >= 2 && 8 * len - 16 <= get_bits_left(&s->gb)) { + int i; char *cbuf = av_malloc(len - 1); - if (cbuf) { - int i; - for (i = 0; i < len - 2; i++) - cbuf[i] = get_bits(&s->gb, 8); - if (i > 0 && cbuf[i - 1] == '\n') - cbuf[i - 1] = 0; - else - cbuf[i] = 0; + if (!cbuf) + return AVERROR(ENOMEM); - if (s->avctx->debug & FF_DEBUG_PICT_INFO) - av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf); - - /* buggy avid, it puts EOI only at every 10th frame */ - if (!strncmp(cbuf, "AVID", 4)) { - parse_avid(s, cbuf, len); - } else if (!strcmp(cbuf, "CS=ITU601")) - s->cs_itu601 = 1; - else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) || - (!strncmp(cbuf, "Metasoft MJPEG Codec", 20))) - s->flipped = 1; - else if (!strcmp(cbuf, "MULTISCOPE II")) { - s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 }; - s->multiscope = 2; - } + for (i = 0; i < len - 2; i++) + cbuf[i] = get_bits(&s->gb, 8); + if (i > 0 && cbuf[i - 1] == '\n') + cbuf[i - 1] = 0; + else + cbuf[i] = 0; - av_free(cbuf); + if (s->avctx->debug & FF_DEBUG_PICT_INFO) + av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf); + + /* buggy avid, it puts EOI only at every 10th frame */ + if (!strncmp(cbuf, "AVID", 4)) { + parse_avid(s, cbuf, len); + } else if (!strcmp(cbuf, "CS=ITU601")) + s->cs_itu601 = 1; + else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) || + (!strncmp(cbuf, "Metasoft MJPEG Codec", 20))) + s->flipped = 1; + else if (!strcmp(cbuf, "MULTISCOPE II")) { + s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 }; + s->multiscope = 2; } + + av_free(cbuf); } return 0; @@ -2114,8 +2115,11 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, else if (start_code >= APP0 && start_code <= APP15) mjpeg_decode_app(s); /* Comment */ - else if (start_code == COM) - mjpeg_decode_com(s); + else if (start_code == COM) { + ret = mjpeg_decode_com(s); + if (ret < 0) + return ret; + } ret = -1; |