]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/smacker: Directly goto error in case of error
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Sat, 25 Jul 2020 11:05:06 +0000 (13:05 +0200)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Thu, 17 Sep 2020 23:35:43 +0000 (01:35 +0200)
The earlier version did not error out directly in case an error happens,
because it would lead to a leak: An allocated array is only reachable
via a local variable at that time; it is only attached to more permanent
storage at the end. While it would be possible to add custom code for
freeing on error (instead of reusing the ordinary code for doing so),
this commit takes the opposite approach and attaches the newly allocated
array to its permanent place immediately after its allocation.

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavcodec/smacker.c

index 8a4d88cfed3601471a9feba22d6093e7ec0f51bc..4b1f0f1b7cfe54bed04c7896836b6f3dd3bce4ca 100644 (file)
@@ -251,17 +251,18 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
         err = AVERROR(ENOMEM);
         goto error;
     }
+    *recodes = huff.values;
 
     res = smacker_decode_bigtree(gb, &huff, &ctx, 0);
-    if (res < 0)
+    if (res < 0) {
         err = res;
+        goto error;
+    }
     skip_bits1(gb);
     if(ctx.last[0] == -1) ctx.last[0] = huff.current++;
     if(ctx.last[1] == -1) ctx.last[1] = huff.current++;
     if(ctx.last[2] == -1) ctx.last[2] = huff.current++;
 
-    *recodes = huff.values;
-
 error:
     for (int i = 0; i < 2; i++) {
         if (vlc[i].table)