Re: 2.99.1: new beta / almost release candidate

Thomas Esser <[email protected]>
Newsgroups gmane.comp.tex.tetex.beta
Message-ID <[email protected]>
> And I sent a patch for teTeX 2.0.2 which has not yet reached me again
> through the list. I fear I might have sent a wrong patch that still
> contained code that would be optimised away by compilers. Here's the
> correct one.

Ok, I have looked at the mandrake patch and they protect memory
(re)allocations in Catalog.cc and XRef.cc. I now have applied a
fix similar to their one, but using comparisons like "pagesSize >=
INT_MAX/sizeof(Page*)" instead of these funny constructs that some
compilers might optimize away.

Thanks for your help, Frank!

Thomas

diff -ru tetex-src-beta-2.99.1.20041026/libs/xpdf/xpdf/Catalog.cc tetex-src/libs/xpdf/xpdf/Catalog.cc
--- tetex-src-beta-2.99.1.20041026/libs/xpdf/xpdf/Catalog.cc	2004-01-22 02:26:45.000000000 +0100
+++ tetex-src/libs/xpdf/xpdf/Catalog.cc	2004-10-27 19:14:44.350094017 +0200
@@ -13,6 +13,7 @@
 #endif
 
 #include <stddef.h>
+#include <limits.h>
 #include "gmem.h"
 #include "Object.h"
 #include "XRef.h"
@@ -64,6 +65,13 @@
   }
   pagesSize = numPages0 = (int)obj.getNum();
   obj.free();
+  if ((pagesSize > INT_MAX / sizeof(Page*)) ||
+      (pagesSize > INT_MAX / sizeof(Ref)) ||
+      (pagesSize < 0)) {
+    error(-1, "Invalid 'pagesSize'");
+    ok = gFalse;
+    return;
+  }
   pages = (Page **)gmalloc(pagesSize * sizeof(Page *));
   pageRefs = (Ref *)gmalloc(pagesSize * sizeof(Ref));
   for (i = 0; i < pagesSize; ++i) {
@@ -191,6 +199,12 @@
       }
       if (start >= pagesSize) {
 	pagesSize += 32;
+        if ((pagesSize > INT_MAX / sizeof(Page*)) ||
+            (pagesSize > INT_MAX / sizeof(Ref)) ||
+            (pagesSize < 0)) {
+          error(-1, "Invalid 'pagesSize' parameter");
+          goto err3;
+        }
 	pages = (Page **)grealloc(pages, pagesSize * sizeof(Page *));
 	pageRefs = (Ref *)grealloc(pageRefs, pagesSize * sizeof(Ref));
 	for (j = pagesSize - 32; j < pagesSize; ++j) {
diff -ru tetex-src-beta-2.99.1.20041026/libs/xpdf/xpdf/XRef.cc tetex-src/libs/xpdf/xpdf/XRef.cc
--- tetex-src-beta-2.99.1.20041026/libs/xpdf/xpdf/XRef.cc	2004-01-22 02:26:45.000000000 +0100
+++ tetex-src/libs/xpdf/xpdf/XRef.cc	2004-10-27 19:16:04.407374178 +0200
@@ -16,6 +16,7 @@
 #include <stddef.h>
 #include <string.h>
 #include <ctype.h>
+#include <limits.h>
 #include "gmem.h"
 #include "Object.h"
 #include "Stream.h"
@@ -107,6 +108,11 @@
   first = obj1.getInt();
   obj1.free();
 
+  if ((nObjects >= INT_MAX / sizeof(int)) ||
+      (nObjects < 0)) {
+    error(-1, "Invalid 'nObjects'");
+    goto err1;
+  }
   objs = new Object[nObjects];
   objNums = (int *)gmalloc(nObjects * sizeof(int));
   offsets = (int *)gmalloc(nObjects * sizeof(int));
@@ -373,6 +379,11 @@
       for (newSize = size ? 2 * size : 1024;
 	   first + n > newSize;
 	   newSize <<= 1) ;
+      if ((newSize >= INT_MAX / sizeof(XRefEntry)) ||
+          (newSize < 0)) {
+        error(-1, "Invalid 'obj' parameters'");
+        return gFalse;
+      }
       entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
       for (i = size; i < newSize; ++i) {
 	entries[i].offset = 0xffffffff;
@@ -475,6 +486,11 @@
   newSize = obj.getInt();
   obj.free();
   if (newSize > size) {
+    if ((newSize >= INT_MAX / sizeof(XRefEntry)) ||
+        (newSize < 0)) {
+      error(-1, "Invalid 'size' parameter");
+      goto err0;
+    }
     entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
     for (i = size; i < newSize; ++i) {
       entries[i].offset = 0xffffffff;
@@ -555,6 +571,11 @@
     for (newSize = size ? 2 * size : 1024;
 	 first + n > newSize;
 	 newSize <<= 1) ;
+    if ((newSize >= INT_MAX / sizeof(XRefEntry)) ||
+        (newSize < 0)) {
+      error(-1, "Invalid 'newSize'");
+      return gFalse;
+    }
     entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
     for (i = size; i < newSize; ++i) {
       entries[i].offset = 0xffffffff;
@@ -683,6 +704,11 @@
 	    if (!strncmp(p, "obj", 3)) {
 	      if (num >= size) {
 		newSize = (num + 1 + 255) & ~255;
+                if ((newSize >= INT_MAX / sizeof(XRefEntry)) ||
+                    (newSize < 0)) {
+                  error(-1, "Invalid 'obj' parameters.");
+                  return gFalse;
+                }
 		entries = (XRefEntry *)
 		            grealloc(entries, newSize * sizeof(XRefEntry));
 		for (i = size; i < newSize; ++i) {
@@ -705,6 +731,11 @@
     } else if (!strncmp(p, "endstream", 9)) {
       if (streamEndsLen == streamEndsSize) {
 	streamEndsSize += 64;
+        if ((streamEndsSize >= INT_MAX / sizeof(int)) ||
+            (streamEndsSize < 0)) {
+          error(-1, "Invalid 'endstream' parameter");
+          return gFalse;
+        }
 	streamEnds = (Guint *)grealloc(streamEnds,
 				       streamEndsSize * sizeof(int));
       }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.