smacker: Free memory properly if the init function fails
authorMartin Storsjö <martin@martin.st>
Wed, 11 Sep 2013 12:55:18 +0000 (15:55 +0300)
committerMartin Storsjö <martin@martin.st>
Wed, 11 Sep 2013 17:20:50 +0000 (20:20 +0300)
Signed-off-by: Martin Storsjö <martin@martin.st>
libavcodec/smacker.c

index 9819fa5..c8850d3 100644 (file)
@@ -534,6 +534,26 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
 
 /*
  *
+ * Uninit smacker decoder
+ *
+ */
+static av_cold int decode_end(AVCodecContext *avctx)
+{
+    SmackVContext * const smk = avctx->priv_data;
+
+    av_freep(&smk->mmap_tbl);
+    av_freep(&smk->mclr_tbl);
+    av_freep(&smk->full_tbl);
+    av_freep(&smk->type_tbl);
+
+    av_frame_unref(&smk->pic);
+
+    return 0;
+}
+
+
+/*
+ *
  * Init smacker decoder
  *
  */
@@ -552,34 +572,16 @@ static av_cold int decode_init(AVCodecContext *avctx)
         return -1;
     }
 
-    if (decode_header_trees(c))
+    if (decode_header_trees(c)) {
+        decode_end(avctx);
         return -1;
+    }
 
     return 0;
 }
 
 
 
-/*
- *
- * Uninit smacker decoder
- *
- */
-static av_cold int decode_end(AVCodecContext *avctx)
-{
-    SmackVContext * const smk = avctx->priv_data;
-
-    av_freep(&smk->mmap_tbl);
-    av_freep(&smk->mclr_tbl);
-    av_freep(&smk->full_tbl);
-    av_freep(&smk->type_tbl);
-
-    av_frame_unref(&smk->pic);
-
-    return 0;
-}
-
-
 static av_cold int smka_decode_init(AVCodecContext *avctx)
 {
     if (avctx->channels < 1 || avctx->channels > 2) {