[FFmpeg-devel] [PATCH] mjpegdec: Properly fail on malloc failure

Michael Niedermayer michael at niedermayer.cc
Mon May 9 20:33:35 CEST 2016


On Mon, May 09, 2016 at 01:58:57PM +0100, Derek Buitenhuis wrote:
> Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>
> ---
>  libavcodec/mjpegdec.c | 56 +++++++++++++++++++++++++++------------------------
>  1 file changed, 30 insertions(+), 26 deletions(-)
> 
> diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
> index 7d38fc2..32e8cee 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;

this possibly should be goto fail like most other failure cases
either way LGTM

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I have never wished to cater to the crowd; for what I know they do not
approve, and what they approve I do not know. -- Epicurus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160509/212a3cca/attachment.sig>


More information about the ffmpeg-devel mailing list