jbig2dec

Ralph Giles <[email protected]> Tue, 04 Mar 2003 09:29:28 -0800
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
Update of /cvsroot/jbig2dec/jbig2dec
In directory sc8-pr-cvs1:/tmp/cvs-serv10898

Modified Files:
	jbig2_segment.c 
Log Message:
Code cleanup: re-order a buffer-size check in the segement header parser to avoid a memory leak on
failure.


Index: jbig2_segment.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_segment.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- jbig2_segment.c	7 Feb 2003 05:14:09 -0000	1.19
+++ jbig2_segment.c	4 Mar 2003 17:29:24 -0000	1.20
@@ -43,12 +43,12 @@
 					     sizeof(Jbig2Segment));
 
   /* 7.2.2 */
-  result->number = jbig2_get_int32 (buf);
+  result->number = jbig2_get_int32(buf);
 
   /* 7.2.3 */
   result->flags = buf[4];
 
-  /* 7.2.4 */
+  /* 7.2.4 referred-to segments */
   rtscarf = buf[5];
   if ((rtscarf & 0xe0) == 0xe0)
     {
@@ -63,13 +63,23 @@
     }
   result->referred_to_segment_count = referred_to_segment_count;
 
+  /* we now have enough information to compute the full header length */
+  referred_to_segment_size = result->number <= 256 ? 1:
+        result->number <= 65536 ? 2 : 4;  /* 7.2.5 */
+  pa_size = result->flags & 0x40 ? 4 : 1; /* 7.2.6 */
+  if (offset + referred_to_segment_count*referred_to_segment_size + pa_size + 4 > buf_size)
+    {
+      jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, result->number, 
+        "jbig2_parse_segment_header() called with insufficient data", -1);
+      jbig2_free (ctx->allocator, result);
+      return NULL;
+    }
+    
   /* 7.2.5 */
   if (referred_to_segment_count)
     {
       int i;
 
-      referred_to_segment_size = result->number <= 256 ? 1:
-        result->number <= 65536 ? 2 : 4;
       referred_to_segments = jbig2_alloc(ctx->allocator, referred_to_segment_count * referred_to_segment_size);
     
       for (i = 0; i < referred_to_segment_count; i++) {
@@ -90,14 +100,6 @@
     }
   
   /* 7.2.6 */
-  pa_size = result->flags & 0x40 ? 4 : 1;
-
-  if (offset + pa_size + 4 > buf_size)
-    {
-      jbig2_free (ctx->allocator, result);
-      return NULL;
-    }
-  
   if (result->flags & 0x40) {
 	result->page_association = jbig2_get_int32(buf + offset);
 	offset += 4;