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));
}