rev 384 - trunk

[email protected] Mon, 3 Jan 2005 20:53:17 -0800 (PST)
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
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=20
are freed. Symbol dictionaries are released, intermediate segment images=20
are released if they haven't already been released and nulled after=20
their use in the decode process, and metadata structures are properly=20
freed.

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


Modified: trunk/jbig2.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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
    =20
-    Copyright (c) 2002-2003 artofcode LLC.
+    Copyright (c) 2002-2005 artofcode LLC.
    =20
     This software is provided AS-IS with no warranty,
     either express or implied.
@@ -353,7 +353,7 @@
=20
   jbig2_free(ca, ctx->buf);
   if (ctx->segments !=3D NULL) {
-    for (i =3D ctx->segment_index; i < ctx->n_segments; i++)
+    for (i =3D 0; i < ctx->n_segments; i++)
       jbig2_free_segment(ctx, ctx->segments[i]);
     jbig2_free(ca, ctx->segments);
   }

Modified: trunk/jbig2_refinement.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 @@
 }
=20
 /**=20
- * 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
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 !=3D 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 !=3D 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);
 }
=20