[FFmpeg-cvslog] lavc/smvjpegdec: fix mem leak in case of init failure

Lukasz Marek git at videolan.org
Mon Nov 24 04:17:02 CET 2014


ffmpeg | branch: master | Lukasz Marek <lukasz.m.luki2 at gmail.com> | Sat Nov 22 23:25:12 2014 +0100| [02cb7d4c9c3adfae84ef0d5646c2de944176f849] | committer: Lukasz Marek

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

Signed-off-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=02cb7d4c9c3adfae84ef0d5646c2de944176f849
---

 libavcodec/smvjpegdec.c |   34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/libavcodec/smvjpegdec.c b/libavcodec/smvjpegdec.c
index 69327cd..375c9d9 100644
--- a/libavcodec/smvjpegdec.c
+++ b/libavcodec/smvjpegdec.c
@@ -75,6 +75,20 @@ static inline void smv_img_pnt(uint8_t *dst_data[4], uint8_t *src_data[4],
         dst_data[1] = src_data[1];
 }
 
+static av_cold int smvjpeg_decode_end(AVCodecContext *avctx)
+{
+    SMVJpegDecodeContext *s = avctx->priv_data;
+    MJpegDecodeContext *jpg = &s->jpg;
+    int ret;
+
+    jpg->picture_ptr = NULL;
+    av_frame_free(&s->picture[0]);
+    av_frame_free(&s->picture[1]);
+    ret = avcodec_close(s->avctx);
+    av_freep(&s->avctx);
+    return ret;
+}
+
 static av_cold int smvjpeg_decode_init(AVCodecContext *avctx)
 {
     SMVJpegDecodeContext *s = avctx->priv_data;
@@ -89,8 +103,10 @@ static av_cold int smvjpeg_decode_init(AVCodecContext *avctx)
         return AVERROR(ENOMEM);
 
     s->picture[1] = av_frame_alloc();
-    if (!s->picture[1])
+    if (!s->picture[1]) {
+        av_frame_free(&s->picture[0]);
         return AVERROR(ENOMEM);
+    }
 
     s->jpg.picture_ptr      = s->picture[0];
 
@@ -120,6 +136,8 @@ static av_cold int smvjpeg_decode_init(AVCodecContext *avctx)
     }
     av_dict_free(&thread_opt);
 
+    if (ret < 0)
+        smvjpeg_decode_end(avctx);
     return ret;
 }
 
@@ -176,20 +194,6 @@ static int smvjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_siz
     return ret;
 }
 
-static av_cold int smvjpeg_decode_end(AVCodecContext *avctx)
-{
-    SMVJpegDecodeContext *s = avctx->priv_data;
-    MJpegDecodeContext *jpg = &s->jpg;
-    int ret;
-
-    jpg->picture_ptr = NULL;
-    av_frame_free(&s->picture[0]);
-    av_frame_free(&s->picture[1]);
-    ret = avcodec_close(s->avctx);
-    av_freep(&s->avctx);
-    return ret;
-}
-
 static const AVClass smvjpegdec_class = {
     .class_name = "SMVJPEG decoder",
     .item_name  = av_default_item_name,



More information about the ffmpeg-cvslog mailing list