summaryrefslogtreecommitdiff
path: root/libavcodec/smacker.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2013-09-11 15:55:18 +0300
committerMartin Storsjö <martin@martin.st>2013-09-11 20:20:50 +0300
commitf3d57dc69145f1b7acb4870da9ce60378190a1fd (patch)
treea17974d78614afb952652c5c2c0c99adb4918ec8 /libavcodec/smacker.c
parent0679cec6e8802643bbe6d5f68ca1110a7d3171da (diff)
downloadffmpeg-f3d57dc69145f1b7acb4870da9ce60378190a1fd.tar.gz
smacker: Free memory properly if the init function fails
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec/smacker.c')
-rw-r--r--libavcodec/smacker.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c
index 9819fa58cc..c8850d3368 100644
--- a/libavcodec/smacker.c
+++ b/libavcodec/smacker.c
@@ -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) {