shithub: jbig2

Download patch

ref: 3d8da657e7aa4624d886414a2356a8c3a43369d7
parent: 653ead574230a4458e55eeee9d863abc9d73e09f
author: Sebastian Rasmussen <sebras@gmail.com>
date: Sun Jun 10 17:14:48 EDT 2018

jbig2dec: Free symbol images upon text region parse error.

The symbol images were previously not freed upon errors.

--- a/jbig2_text.c
+++ b/jbig2_text.c
@@ -77,6 +77,8 @@
     bool first_symbol;
     uint32_t index, SBNUMSYMS;
     Jbig2Image *IB = NULL;
+    Jbig2Image *IBO = NULL;
+    Jbig2Image *refimage = NULL;
     Jbig2HuffmanState *hs = NULL;
     Jbig2HuffmanTable *SBSYMCODES = NULL;
     int code = 0;
@@ -379,9 +381,7 @@
             }
             if (RI) {
                 Jbig2RefinementRegionParams rparams;
-                Jbig2Image *IBO;
                 int32_t RDW, RDH, RDX, RDY;
-                Jbig2Image *refimage;
                 int BMSIZE = 0;
                 int code1 = 0;
                 int code2 = 0;
@@ -411,7 +411,6 @@
                     goto cleanup2;
                 }
                 if (code1 > 0 || code2 > 0 || code3 > 0 || code4 > 0 || code5 > 0 || code6 > 0) {
-                    jbig2_image_release(ctx, IB);
                     code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "OOB obtained when decoding symbol instance refinement data");
                     goto cleanup2;
                 }
@@ -418,18 +417,15 @@
 
                 /* 6.4.11 (6) */
                 IBO = IB;
+                IB = NULL;
                 if (((int32_t) IBO->width) + RDW < 0 || ((int32_t) IBO->height) + RDH < 0) {
-                    jbig2_image_release(ctx, IBO);
                     code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "reference image dimensions negative");
                     goto cleanup2;
                 }
                 refimage = jbig2_image_new(ctx, IBO->width + RDW, IBO->height + RDH);
                 if (refimage == NULL) {
-                    jbig2_image_release(ctx, IBO);
-                    if (params->SBHUFF) {
-                        jbig2_release_huffman_table(ctx, SBSYMCODES);
-                    }
-                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "couldn't allocate reference image");
+                    code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "couldn't allocate reference image");
+                    goto cleanup2;
                 }
                 jbig2_image_clear(ctx, refimage, 0x00);
 
@@ -443,13 +439,13 @@
                 code = jbig2_decode_refinement_region(ctx, segment, &rparams, as, refimage, GR_stats);
                 if (code < 0) {
                     jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode refinement region");
-                    jbig2_image_release(ctx, refimage);
-                    jbig2_image_release(ctx, IBO);
                     goto cleanup2;
                 }
 
                 jbig2_image_release(ctx, IBO);
+                IBO = NULL;
                 IB = refimage;
+                refimage = NULL;
 
                 /* 6.4.11 (7) */
                 if (params->SBHUFF) {
@@ -456,8 +452,6 @@
                     code = jbig2_huffman_advance(hs, BMSIZE);
                     if (code < 0) {
                         jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to advance after huffman decoding refinement region");
-                        jbig2_image_release(ctx, refimage);
-                        jbig2_image_release(ctx, IBO);
                         goto cleanup2;
                     }
                 }
@@ -524,7 +518,6 @@
             code = jbig2_image_compose(ctx, image, IB, x, y, params->SBCOMBOP);
             if (code < 0) {
                 jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to compose symbol instance symbol bitmap into picture");
-                jbig2_image_release(ctx, IB);
                 goto cleanup2;
             }
 
@@ -539,6 +532,7 @@
             NINSTANCES++;
 
             jbig2_image_release(ctx, IB);
+            IB = NULL;
         }
         /* end strip */
     }
@@ -545,6 +539,9 @@
     /* 6.4.5 (4) */
 
 cleanup2:
+    jbig2_image_release(ctx, refimage);
+    jbig2_image_release(ctx, IBO);
+    jbig2_image_release(ctx, IB);
     if (params->SBHUFF) {
         jbig2_release_huffman_table(ctx, SBSYMCODES);
     }