[jbig2-cvs] rev 384 - trunk

giles at ghostscript.com giles at ghostscript.com
Mon Jan 3 20:53:17 PST 2005


Author: giles
Date: 2005-01-03 20:53:16 -0800 (Mon, 03 Jan 2005)
New Revision: 384

Modified:
   trunk/jbig2.c
   trunk/jbig2_refinement.c
   trunk/jbig2_segment.c
Log:
Properly free some segment results when the segment header structures 
are freed. Symbol dictionaries are released, intermediate segment images 
are released if they haven't already been released and nulled after 
their use in the decode process, and metadata structures are properly 
freed.

Resolves all known leaks with the first 7 ubc test streams.


Modified: trunk/jbig2.c
===================================================================
--- trunk/jbig2.c	2005-01-04 04:41:56 UTC (rev 383)
+++ trunk/jbig2.c	2005-01-04 04:53:16 UTC (rev 384)
@@ -1,7 +1,7 @@
 /*
     jbig2dec
     
-    Copyright (c) 2002-2003 artofcode LLC.
+    Copyright (c) 2002-2005 artofcode LLC.
     
     This software is provided AS-IS with no warranty,
     either express or implied.
@@ -353,7 +353,7 @@
 
   jbig2_free(ca, ctx->buf);
   if (ctx->segments != NULL) {
-    for (i = ctx->segment_index; i < ctx->n_segments; i++)
+    for (i = 0; i < ctx->n_segments; i++)
       jbig2_free_segment(ctx, ctx->segments[i]);
     jbig2_free(ca, ctx->segments);
   }

Modified: trunk/jbig2_refinement.c
===================================================================
--- trunk/jbig2_refinement.c	2005-01-04 04:41:56 UTC (rev 383)
+++ trunk/jbig2_refinement.c	2005-01-04 04:53:16 UTC (rev 384)
@@ -319,7 +319,7 @@
 }
 
 /** 
- * Handler for immediate generic region segments
+ * Handler for generic refinement region segments
  */
 int
 jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment,

Modified: trunk/jbig2_segment.c
===================================================================
--- trunk/jbig2_segment.c	2005-01-04 04:41:56 UTC (rev 383)
+++ trunk/jbig2_segment.c	2005-01-04 04:53:16 UTC (rev 384)
@@ -129,7 +129,24 @@
   if (segment->referred_to_segments != NULL) {
     jbig2_free(ctx->allocator, segment->referred_to_segments);
   }
-  /* todo: free result */
+  /* todo: we need either some separate fields or
+     a more complex result object rather than this
+     brittle special casing */
+    switch (segment->flags & 63) {
+	case 0:  /* symbol dictionary */
+	  jbig2_sd_release(ctx, segment->result);
+	case 4:  /* intermediate text region */
+	case 40: /* intermediate refinement region */
+	  if (segment->result != NULL)
+	    jbig2_image_release(ctx, segment->result);
+	  break;
+	case 62:
+	  jbig2_metadata_free(ctx, segment->result);
+	  break;
+	default:
+	  /* anything is is probably an undefined pointer */
+	  break;
+    }
   jbig2_free (ctx->allocator, segment);
 }
 



More information about the jbig2-cvs mailing list