File xpdf-safe-int.patch of Package xpdf
--- xpdf-3.02/fofi/FoFiTrueType.cc
+++ xpdf-3.02/fofi/FoFiTrueType.cc
@@ -396,7 +396,7 @@
return nameToGID->lookupInt(name);
}
-Gushort *FoFiTrueType::getCIDToGIDMap(int *nCIDs) {
+Gushort *FoFiTrueType::getCIDToGIDMap(SafeInt *nCIDs) {
FoFiType1C *ff;
Gushort *map;
int i;
@@ -504,7 +504,7 @@
}
void FoFiTrueType::convertToCIDType2(char *psName,
- Gushort *cidMap, int nCIDs,
+ Gushort *cidMap, SafeInt nCIDs,
GBool needVerticalMetrics,
FoFiOutputFunc outputFunc,
void *outputStream) {
@@ -538,7 +538,7 @@
(*outputFunc)(outputStream, " end def\n", 10);
(*outputFunc)(outputStream, "/GDBytes 2 def\n", 15);
if (cidMap) {
- buf = GString::format("/CIDCount {0:d} def\n", nCIDs);
+ buf = GString::format("/CIDCount {0:d} def\n", nCIDs.Int());
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
if (nCIDs > 32767) {
@@ -577,13 +577,13 @@
}
} else {
// direct mapping - just fill the string(s) with s[i]=i
- buf = GString::format("/CIDCount {0:d} def\n", nGlyphs);
+ buf = GString::format("/CIDCount {0:d} def\n", nGlyphs.Int());
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
if (nGlyphs > 32767) {
(*outputFunc)(outputStream, "/CIDMap [\n", 10);
for (i = 0; i < nGlyphs; i += 32767) {
- j = nGlyphs - i < 32767 ? nGlyphs - i : 32767;
+ j = nGlyphs.Int() - i < 32767 ? nGlyphs.Int() - i : 32767;
buf = GString::format(" {0:d} string 0 1 {1:d} {{\n", 2 * j, j - 1);
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
@@ -599,10 +599,10 @@
}
(*outputFunc)(outputStream, "] def\n", 6);
} else {
- buf = GString::format("/CIDMap {0:d} string\n", 2 * nGlyphs);
+ buf = GString::format("/CIDMap {0:d} string\n", 2 * nGlyphs.Int());
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
- buf = GString::format(" 0 1 {0:d} {{\n", nGlyphs - 1);
+ buf = GString::format(" 0 1 {0:d} {{\n", nGlyphs.Int() - 1);
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
(*outputFunc)(outputStream,
@@ -654,7 +654,7 @@
delete ff;
}
-void FoFiTrueType::convertToType0(char *psName, Gushort *cidMap, int nCIDs,
+void FoFiTrueType::convertToType0(char *psName, Gushort *cidMap, SafeInt nCIDs,
GBool needVerticalMetrics,
FoFiOutputFunc outputFunc,
void *outputStream) {
@@ -672,7 +672,7 @@
delete sfntsName;
// write the descendant Type 42 fonts
- n = cidMap ? nCIDs : nGlyphs;
+ n = cidMap ? nCIDs.Int() : nGlyphs.Int();
for (i = 0; i < n; i += 256) {
(*outputFunc)(outputStream, "10 dict begin\n", 14);
(*outputFunc)(outputStream, "/FontName /", 11);
@@ -836,12 +836,13 @@
};
GBool missingCmap, missingName, missingPost, missingOS2;
GBool unsortedLoca, badCmapLen, abbrevHMTX;
- int nZeroLengthTables;
+ SafeInt nZeroLengthTables;
int nHMetrics, advWidth, lsb;
TrueTypeLoca *locaTable;
TrueTypeTable *newTables;
char *newNameTab, *newCmapTab, *newHHEATab, *newHMTXTab;
- int nNewTables, cmapIdx, cmapLen, glyfLen, newNameLen, newCmapLen, next;
+ SafeInt nNewTables;
+ int cmapIdx, cmapLen, glyfLen, newNameLen, newCmapLen, next;
int newHHEALen, newHMTXLen;
Guint locaChecksum, glyfChecksum, fileChecksum;
char *tableDir;
@@ -866,7 +867,7 @@
missingOS2 = seekTable("OS/2") < 0;
// read the loca table, check to see if it's sorted
- locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca));
+ locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + SafeInt(1), sizeof(TrueTypeLoca));
unsortedLoca = gFalse;
i = seekTable("loca");
pos = tables[i].offset;
@@ -943,13 +944,13 @@
// the same pos value remain in the same order)
glyfLen = 0; // make gcc happy
if (unsortedLoca) {
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
+ qsort(locaTable, nGlyphs.Int() + 1, sizeof(TrueTypeLoca),
&cmpTrueTypeLocaOffset);
for (i = 0; i < nGlyphs; ++i) {
locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
}
- locaTable[nGlyphs].len = 0;
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
+ locaTable[nGlyphs.Int()].len = 0;
+ qsort(locaTable, nGlyphs.Int() + 1, sizeof(TrueTypeLoca),
&cmpTrueTypeLocaIdx);
pos = 0;
for (i = 0; i <= nGlyphs; ++i) {
@@ -992,7 +993,7 @@
// construct the new name table
if (name) {
n = strlen(name);
- newNameLen = (6 + 4*12 + 2 * (3*n + 7) + 3) & ~3;
+ newNameLen = (6 + 4*12 + 2 * (3*SafeInt(n) + 7) + 3).Int() & ~3;
newNameTab = (char *)gmalloc(newNameLen);
memset(newNameTab, 0, newNameLen);
newNameTab[0] = 0; // format selector
@@ -1097,11 +1098,11 @@
for (i = 0; i < newHHEALen; ++i) {
newHHEATab[i] = getU8(pos++, &ok);
}
- newHHEATab[34] = nGlyphs >> 8;
- newHHEATab[35] = nGlyphs & 0xff;
+ newHHEATab[34] = nGlyphs.Int() >> 8;
+ newHHEATab[35] = nGlyphs.Int() & 0xff;
i = seekTable("hmtx");
pos = tables[i].offset;
- newHMTXLen = 4 * nGlyphs;
+ newHMTXLen = (4 * nGlyphs).Int();
newHMTXTab = (char *)gmalloc(newHMTXLen);
advWidth = 0;
for (i = 0; i < nHMetrics; ++i) {
@@ -1157,7 +1158,7 @@
} else if (newTables[j].tag == cmapTag && badCmapLen) {
newTables[j].len = cmapLen;
} else if (newTables[j].tag == locaTag && unsortedLoca) {
- newTables[j].len = (nGlyphs + 1) * (locaFmt ? 4 : 2);
+ newTables[j].len = (nGlyphs.Int() + 1) * (locaFmt ? 4 : 2);
newTables[j].checksum = locaChecksum;
} else if (newTables[j].tag == glyfTag && unsortedLoca) {
newTables[j].len = glyfLen;
@@ -1218,9 +1219,9 @@
newTables[j].len = sizeof(os2Tab);
++j;
}
- qsort(newTables, nNewTables, sizeof(TrueTypeTable),
+ qsort(newTables, nNewTables.Int(), sizeof(TrueTypeTable),
&cmpTrueTypeTableTag);
- pos = 12 + nNewTables * 16;
+ pos = 12 + nNewTables.Int() * 16;
for (i = 0; i < nNewTables; ++i) {
newTables[i].offset = pos;
pos += newTables[i].len;
@@ -1230,20 +1231,20 @@
}
// write the table directory
- tableDir = (char *)gmalloc(12 + nNewTables * 16);
+ tableDir = (char *)gmalloc((SafeInt(12) + nNewTables * SafeInt(16)).Int());
tableDir[0] = 0x00; // sfnt version
tableDir[1] = 0x01;
tableDir[2] = 0x00;
tableDir[3] = 0x00;
- tableDir[4] = (char)((nNewTables >> 8) & 0xff); // numTables
- tableDir[5] = (char)(nNewTables & 0xff);
- for (i = -1, t = (Guint)nNewTables; t; ++i, t >>= 1) ;
+ tableDir[4] = (char)((nNewTables.Int() >> 8) & 0xff); // numTables
+ tableDir[5] = (char)(nNewTables.Int() & 0xff);
+ for (i = -1, t = (Guint)nNewTables.Int(); t; ++i, t >>= 1) ;
t = 1 << (4 + i);
tableDir[6] = (char)((t >> 8) & 0xff); // searchRange
tableDir[7] = (char)(t & 0xff);
tableDir[8] = (char)((i >> 8) & 0xff); // entrySelector
tableDir[9] = (char)(i & 0xff);
- t = nNewTables * 16 - t;
+ t = nNewTables.Int() * 16 - t;
tableDir[10] = (char)((t >> 8) & 0xff); // rangeShift
tableDir[11] = (char)(t & 0xff);
pos = 12;
@@ -1266,11 +1267,11 @@
tableDir[pos+15] = (char) newTables[i].len;
pos += 16;
}
- (*outputFunc)(outputStream, tableDir, 12 + nNewTables * 16);
+ (*outputFunc)(outputStream, tableDir, 12 + nNewTables.Int() * 16);
// compute the file checksum
fileChecksum = computeTableChecksum((Guchar *)tableDir,
- 12 + nNewTables * 16);
+ 12 + nNewTables.Int() * 16);
for (i = 0; i < nNewTables; ++i) {
fileChecksum += newTables[i].checksum;
}
@@ -1458,7 +1459,7 @@
Guchar tableDir[12 + nT42Tables*16];
GBool ok;
Guint checksum;
- int nNewTables;
+ SafeInt nNewTables;
int length, pos, glyfPos, i, j, k;
Guchar vheaTab[36] = {
0, 1, 0, 0, // table version number
@@ -1499,7 +1500,7 @@
// table, cmpTrueTypeLocaPos uses offset as its primary sort key,
// and idx as its secondary key (ensuring that adjacent entries with
// the same pos value remain in the same order)
- locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca));
+ locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + SafeInt(1), sizeof(TrueTypeLoca));
i = seekTable("loca");
pos = tables[i].offset;
ok = gTrue;
@@ -1511,13 +1512,13 @@
locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
}
}
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
+ qsort(locaTable, nGlyphs.Int() + 1, sizeof(TrueTypeLoca),
&cmpTrueTypeLocaOffset);
for (i = 0; i < nGlyphs; ++i) {
locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
}
- locaTable[nGlyphs].len = 0;
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
+ locaTable[nGlyphs.Int()].len = 0;
+ qsort(locaTable, nGlyphs.Int() + 1, sizeof(TrueTypeLoca),
&cmpTrueTypeLocaIdx);
pos = 0;
for (i = 0; i <= nGlyphs; ++i) {
@@ -1529,7 +1530,7 @@
}
// construct the new 'loca' table
- locaData = (Guchar *)gmallocn(nGlyphs + 1, (locaFmt ? 4 : 2));
+ locaData = (Guchar *)gmallocn(nGlyphs + SafeInt(1), (locaFmt ? 4 : 2));
for (i = 0; i <= nGlyphs; ++i) {
pos = locaTable[i].newOffset;
if (locaFmt) {
@@ -1570,7 +1571,7 @@
// construct the new table headers, including table checksums
// (pad each table out to a multiple of 4 bytes)
- pos = 12 + nNewTables*16;
+ pos = 12 + nNewTables.Int()*16;
k = 0;
for (i = 0; i < nT42Tables; ++i) {
length = -1;
@@ -1579,7 +1580,7 @@
length = 54;
checksum = computeTableChecksum(headData, 54);
} else if (i == t42LocaTable) {
- length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
+ length = (nGlyphs.Int() + 1) * (locaFmt ? 4 : 2);
checksum = computeTableChecksum(locaData, length);
} else if (i == t42GlyfTable) {
length = 0;
@@ -1608,7 +1609,7 @@
length = sizeof(vheaTab);
checksum = computeTableChecksum(vheaTab, length);
} else if (needVerticalMetrics && i == t42VmtxTable) {
- length = 4 + (nGlyphs - 1) * 4;
+ length = (4 + (nGlyphs - 1) * 4).Int();
vmtxTab = (Guchar *)gmalloc(length);
vmtxTab[0] = advance / 256;
vmtxTab[1] = advance % 256;
@@ -1646,13 +1647,13 @@
tableDir[2] = 0x00;
tableDir[3] = 0x00;
tableDir[4] = 0; // numTables
- tableDir[5] = nNewTables;
+ tableDir[5] = nNewTables.Int();
tableDir[6] = 0; // searchRange
tableDir[7] = (Guchar)128;
tableDir[8] = 0; // entrySelector
tableDir[9] = 3;
tableDir[10] = 0; // rangeShift
- tableDir[11] = (Guchar)(16 * nNewTables - 128);
+ tableDir[11] = (Guchar)(16 * nNewTables.Int() - 128);
pos = 12;
for (i = 0; i < nNewTables; ++i) {
tableDir[pos ] = (Guchar)(newTables[i].tag >> 24);
@@ -1675,7 +1676,7 @@
}
// compute the font checksum and store it in the head table
- checksum = computeTableChecksum(tableDir, 12 + nNewTables*16);
+ checksum = computeTableChecksum(tableDir, 12 + nNewTables.Int()*16);
for (i = 0; i < nNewTables; ++i) {
checksum += newTables[i].checksum;
}
@@ -1695,14 +1696,14 @@
}
// write the table directory
- dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream);
+ dumpString(tableDir, 12 + nNewTables.Int()*16, outputFunc, outputStream);
// write the tables
for (i = 0; i < nNewTables; ++i) {
if (i == t42HeadTable) {
dumpString(headData, 54, outputFunc, outputStream);
} else if (i == t42LocaTable) {
- length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
+ length = (nGlyphs.Int() + 1) * (locaFmt ? 4 : 2);
dumpString(locaData, length, outputFunc, outputStream);
} else if (i == t42GlyfTable) {
glyfPos = tables[seekTable("glyf")].offset;
@@ -1909,7 +1910,7 @@
parsedOk = gFalse;
return;
}
- if (tables[i].len < (nGlyphs + 1) * (locaFmt ? 4 : 2)) {
+ if (tables[i].len < (nGlyphs.Int() + 1) * (locaFmt ? 4 : 2)) {
nGlyphs = tables[i].len / (locaFmt ? 4 : 2) - 1;
}
for (j = 0; j <= nGlyphs; ++j) {
@@ -1958,7 +1959,7 @@
goto err;
}
if (n > nGlyphs) {
- n = nGlyphs;
+ n = nGlyphs.Int();
}
stringIdx = 0;
stringPos = tablePos + 34 + 2*n;
--- xpdf-3.02/fofi/FoFiTrueType.h
+++ xpdf-3.02/fofi/FoFiTrueType.h
@@ -66,7 +66,7 @@
// Return the mapping from CIDs to GIDs, and return the number of
// CIDs in *<nCIDs>. This is only useful for CID fonts. (Only
// useful for OpenType CFF fonts.)
- Gushort *getCIDToGIDMap(int *nCIDs);
+ Gushort *getCIDToGIDMap(SafeInt *nCIDs);
// Returns the least restrictive embedding licensing right (as
// defined by the TrueType spec):
@@ -103,7 +103,7 @@
// name (so we don't need to depend on the 'name' table in the
// font). The <cidMap> array maps CIDs to GIDs; it has <nCIDs>
// entries. (Not useful for OpenType CFF fonts.)
- void convertToCIDType2(char *psName, Gushort *cidMap, int nCIDs,
+ void convertToCIDType2(char *psName, Gushort *cidMap, SafeInt nCIDs,
GBool needVerticalMetrics,
FoFiOutputFunc outputFunc, void *outputStream);
@@ -118,7 +118,7 @@
// PostScript font name (so we don't need to depend on the 'name'
// table in the font). The <cidMap> array maps CIDs to GIDs; it has
// <nCIDs> entries. (Not useful for OpenType CFF fonts.)
- void convertToType0(char *psName, Gushort *cidMap, int nCIDs,
+ void convertToType0(char *psName, Gushort *cidMap, SafeInt nCIDs,
GBool needVerticalMetrics,
FoFiOutputFunc outputFunc, void *outputStream);
@@ -159,10 +159,10 @@
int seekTable(char *tag);
TrueTypeTable *tables;
- int nTables;
+ SafeInt nTables;
TrueTypeCmap *cmaps;
int nCmaps;
- int nGlyphs;
+ SafeInt nGlyphs;
int locaFmt;
int bbox[4];
GHash *nameToGID;
--- xpdf-3.02/fofi/FoFiType1C.cc
+++ xpdf-3.02/fofi/FoFiType1C.cc
@@ -101,9 +101,10 @@
return encoding;
}
-Gushort *FoFiType1C::getCIDToGIDMap(int *nCIDs) {
+Gushort *FoFiType1C::getCIDToGIDMap(SafeInt *nCIDs) {
Gushort *map;
- int n, i;
+ SafeInt n;
+ int i;
// a CID font's top dict has ROS as the first operator
if (topDict.firstOp != 0x0c1e) {
@@ -121,7 +122,7 @@
}
++n;
map = (Gushort *)gmallocn(n, sizeof(Gushort));
- memset(map, 0, n * sizeof(Gushort));
+ memset(map, 0, n.Int() * sizeof(Gushort));
for (i = 0; i < nGlyphs; ++i) {
map[charset[i]] = i;
}
@@ -437,7 +438,8 @@
int *charStringOffsets;
Type1CIndex subrIdx;
Type1CIndexVal val;
- int nCIDs, gdBytes;
+ SafeInt nCIDs;
+ int gdBytes;
GString *buf;
char buf2[256];
GBool ok;
@@ -460,7 +462,7 @@
// build the charstrings
charStrings = new GString();
- charStringOffsets = (int *)gmallocn(nCIDs + 1, sizeof(int));
+ charStringOffsets = (int *)gmallocn(nCIDs + SafeInt(1), sizeof(int));
for (i = 0; i < nCIDs; ++i) {
charStringOffsets[i] = charStrings->getLength();
if ((gid = cidMap[i]) >= 0) {
@@ -476,13 +478,13 @@
}
}
}
- charStringOffsets[nCIDs] = charStrings->getLength();
+ charStringOffsets[nCIDs.Int()] = charStrings->getLength();
// compute gdBytes = number of bytes needed for charstring offsets
// (offset size needs to account for the charstring offset table,
// with a worst case of five bytes per entry, plus the charstrings
// themselves)
- i = (nCIDs + 1) * 5 + charStrings->getLength();
+ i = (nCIDs.Int() + 1) * 5 + charStrings->getLength();
if (i < 0x100) {
gdBytes = 1;
} else if (i < 0x10000) {
@@ -547,7 +549,7 @@
(*outputFunc)(outputStream, "end def\n", 8);
// CIDFont-specific entries
- buf = GString::format("/CIDCount {0:d} def\n", nCIDs);
+ buf = GString::format("/CIDCount {0:d} def\n", nCIDs.Int());
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
(*outputFunc)(outputStream, "/FDBytes 1 def\n", 15);
@@ -565,7 +567,7 @@
}
// FDArray entry
- buf = GString::format("/FDArray {0:d} array\n", nFDs);
+ buf = GString::format("/FDArray {0:d} array\n", nFDs.Int());
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
delete buf;
for (i = 0; i < nFDs; ++i) {
@@ -708,7 +710,7 @@
(*outputFunc)(outputStream, "def\n", 4);
// start the binary section
- offset = (nCIDs + 1) * (1 + gdBytes);
+ offset = (nCIDs.Int() + 1) * (1 + gdBytes);
buf = GString::format("(Hex) {0:d} StartData\n",
offset + charStrings->getLength());
(*outputFunc)(outputStream, buf->getCString(), buf->getLength());
@@ -761,7 +763,7 @@
int *cidMap;
Type1CIndex subrIdx;
Type1CIndexVal val;
- int nCIDs;
+ SafeInt nCIDs;
GString *buf;
Type1CEexecBuf eb;
GBool ok;
--- xpdf-3.02/fofi/FoFiType1C.h
+++ xpdf-3.02/fofi/FoFiType1C.h
@@ -151,7 +151,7 @@
// Return the mapping from CIDs to GIDs, and return the number of
// CIDs in *<nCIDs>. This is only useful for CID fonts.
- Gushort *getCIDToGIDMap(int *nCIDs);
+ Gushort *getCIDToGIDMap(SafeInt *nCIDs);
// Convert to a Type 1 font, suitable for embedding in a PostScript
// file. This is only useful with 8-bit fonts. If <newEncoding> is
@@ -216,7 +216,7 @@
Type1CPrivateDict *privateDicts;
int nGlyphs;
- int nFDs;
+ SafeInt nFDs;
Guchar *fdSelect;
Gushort *charset;
int gsubrBias;
--- xpdf-3.02/goo/GHash.cc
+++ xpdf-3.02/goo/GHash.cc
@@ -311,7 +311,8 @@
void GHash::expand() {
GHashBucket **oldTab;
GHashBucket *p;
- int oldSize, h, i;
+ int h, i;
+ SafeInt oldSize;
oldSize = size;
oldTab = tab;
@@ -365,7 +366,7 @@
for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) {
h = 17 * h + (int)(*p & 0xff);
}
- return (int)(h % size);
+ return (int)(h % size.Int());
}
int GHash::hash(char *key) {
@@ -376,5 +377,5 @@
for (p = key; *p; ++p) {
h = 17 * h + (int)(*p & 0xff);
}
- return (int)(h % size);
+ return (int)(h % size.Int());
}
--- xpdf-3.02/goo/GHash.h
+++ xpdf-3.02/goo/GHash.h
@@ -55,7 +55,7 @@
int hash(char *key);
GBool deleteKeys; // set if key strings should be deleted
- int size; // number of buckets
+ SafeInt size; // number of buckets
int len; // number of entries
GHashBucket **tab;
};
--- xpdf-3.02/goo/GList.cc
+++ xpdf-3.02/goo/GList.cc
@@ -43,7 +43,7 @@
if (length >= size) {
expand();
}
- data[length++] = p;
+ data[(length++).Int()] = p;
}
void GList::append(GList *list) {
@@ -53,7 +53,7 @@
expand();
}
for (i = 0; i < list->length; ++i) {
- data[length++] = list->data[i];
+ data[(length++).Int()] = list->data[i];
}
}
@@ -62,7 +62,7 @@
expand();
}
if (i < length) {
- memmove(data+i+1, data+i, (length - i) * sizeof(void *));
+ memmove(data+i+1, data+i, (length.Int() - i) * sizeof(void *));
}
data[i] = p;
++length;
@@ -73,7 +73,7 @@
p = data[i];
if (i < length - 1) {
- memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *));
+ memmove(data+i, data+i+1, (length.Int() - i - 1) * sizeof(void *));
}
--length;
if (size - length >= ((inc > 0) ? inc : size/2)) {
@@ -83,7 +83,7 @@
}
void GList::sort(int (*cmp)(const void *obj1, const void *obj2)) {
- qsort(data, length, sizeof(void *), cmp);
+ qsort(data, length.Int(), sizeof(void *), cmp);
}
void GList::expand() {
--- xpdf-3.02/goo/GList.h
+++ xpdf-3.02/goo/GList.h
@@ -16,6 +16,7 @@
#endif
#include "gtypes.h"
+#include "gmem.h"
//------------------------------------------------------------------------
// GList
@@ -36,7 +37,7 @@
//----- general
// Get the number of elements.
- int getLength() { return length; }
+ int getLength() { return length.Int(); }
//----- ordered list support
@@ -76,9 +77,9 @@
void shrink();
void **data; // the list elements
- int size; // size of data array
- int length; // number of elements on list
- int inc; // allocation increment
+ SafeInt size; // size of data array
+ SafeInt length; // number of elements on list
+ SafeInt inc; // allocation increment
};
#define deleteGList(list, T) \
--- xpdf-3.02/goo/GString.cc
+++ xpdf-3.02/goo/GString.cc
@@ -224,7 +224,8 @@
GString *GString::appendfv(char *fmt, va_list argList) {
GStringFormatArg *args;
- int argsLen, argsSize;
+ int argsLen;
+ SafeInt argsSize;
GStringFormatArg arg;
int idx, width, prec;
GBool reverseAlign, zeroFill;
--- xpdf-3.02/goo/gmem.cc
+++ xpdf-3.02/goo/gmem.cc
@@ -186,14 +186,335 @@
#endif
}
-void *gmallocn(int nObjs, int objSize) GMEM_EXCEP {
- int n;
+SafeInt::SafeInt(const long long int cA)
+{
+ if (cA < -INT_MAX || INT_MAX < cA)
+ integer_overflow("SafeInt::SafeInt(long long): ");
+ c = cA;
+}
+
+SafeInt::SafeInt()
+{ }
+
+SafeInt::SafeInt(const SafeInt& copy): c(copy.c)
+{ }
+
+SafeInt SafeInt::create(const long long int cA)
+{
+ return SafeInt(cA);
+}
+
+int SafeInt::Int(void) const
+{
+ return c;
+}
+
+void SafeInt::integer_overflow(const char * prefix)
+{
+ fprintf(stderr, "error: %sinteger overflow", prefix);
+ exit (1);
+}
+
+void SafeInt::division_by_zero(const char * prefix)
+{
+ fprintf(stderr, "error: %sdivide by zero", prefix);
+ exit(1);
+}
+
+void SafeInt::shift_is_negative(const char * prefix)
+{
+ fprintf(stderr, "warning: %sbitwise shift amount is negative", prefix);
+}
+
+SafeInt& SafeInt::operator=(const int& cA)
+{
+ *this = SafeInt(cA);
+ return *this;
+}
+
+bool SafeInt::operator==(const SafeInt& right) const
+{
+ return c == right.c;
+}
+
+bool SafeInt::operator!=(const SafeInt& right) const
+{
+ return c != right.c;
+}
+
+bool SafeInt::operator<(const SafeInt& right) const
+{
+ return c < right.c;
+}
+
+bool SafeInt::operator<=(const SafeInt& right) const
+{
+ return c <= right.c;
+}
+
+bool SafeInt::operator>(const SafeInt& right) const
+{
+ return c > right.c;
+}
+
+bool SafeInt::operator>=(const SafeInt& right) const
+{
+ return c >= right.c;
+}
+
+bool SafeInt::operator==(const int& right) const
+{
+ return c == right;
+}
+
+bool SafeInt::operator!=(const int& right) const
+{
+ return c != right;
+}
+
+bool SafeInt::operator<(const int& right) const
+{
+ return c < right;
+}
+
+bool SafeInt::operator<=(const int& right) const
+{
+ return c <= right;
+}
+
+bool SafeInt::operator>(const int& right) const
+{
+ return c > right;
+}
+
+bool SafeInt::operator>=(const int& right) const
+{
+ return c >= right;
+}
+
+bool operator==(const int& left, const SafeInt& right)
+{
+ return left == right.c;
+}
+
+bool operator!=(const int& left, const SafeInt& right)
+{
+ return left != right.c;
+}
+
+bool operator<(const int& left, const SafeInt& right)
+{
+ return left < right.c;
+}
+
+bool operator<=(const int& left, const SafeInt& right)
+{
+ return left <= right.c;
+}
+
+bool operator>(const int& left, const SafeInt& right)
+{
+ return left > right.c;
+}
+
+bool operator>=(const int& left, const SafeInt& right)
+{
+ return left >= right.c;
+}
+
+SafeInt SafeInt::operator+() const
+{
+ return SafeInt(*this);
+}
+
+SafeInt SafeInt::operator+(const SafeInt& right) const
+{
+ if (c*right.c > 0 &&
+ ((c > 0 && c > INT_MAX - right.c) ||
+ (c < 0 && c < -INT_MAX - right.c)))
+ integer_overflow("SafeInt::operator+(): ");
+ return SafeInt(c + right.c);
+}
+
+SafeInt SafeInt::operator-() const
+{
+ return SafeInt(-c);
+}
+
+SafeInt SafeInt::operator-(const SafeInt& right) const
+{
+ return *this + (-right);
+}
+
+SafeInt SafeInt::operator*(const SafeInt& right) const
+{
+ if (right.c != 0 && c*right.c/right.c != c)
+ integer_overflow("SafeInt::operator*(): ");
+ return SafeInt(c * right.c);
+}
+
+SafeInt SafeInt::operator/(const SafeInt& right) const
+{
+ return SafeInt(c / right.c);
+}
+
+SafeInt SafeInt::operator%(const SafeInt& right) const
+{
+ return SafeInt(c % right.c);
+}
+
+SafeInt SafeInt::operator/(const int& right) const
+{
+ if (right == 0)
+ division_by_zero("SafeInt::operator/(): ");
+ return SafeInt(c / right);
+}
+
+SafeInt SafeInt::operator%(const int& right) const
+{
+ return SafeInt(c % right);
+}
+
+SafeInt& SafeInt::operator+=(const SafeInt& right)
+{
+ *this = *this + right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator-=(const SafeInt& right)
+{
+ *this = *this - right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator*=(const SafeInt& right)
+{
+ *this = *this * right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator/=(const SafeInt& right)
+{
+ *this = *this / right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator%=(const SafeInt& right)
+{
+ *this = *this % right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator/=(const int& right)
+{
+ *this = *this / right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator%=(const int& right)
+{
+ *this = *this % right;
+ return *this;
+}
+
+SafeInt& SafeInt::operator++()
+{
+ *this += one;
+ return *this;
+}
+
+SafeInt SafeInt::operator++(int)
+{
+ SafeInt res(*this);
+ *this += one;
+ return res;
+}
+
+SafeInt& SafeInt::operator--()
+{
+ *this -= one;
+ return *this;
+}
+
+SafeInt SafeInt::operator--(int)
+{
+ SafeInt res(*this);
+ *this -= one;
+ return res;
+}
+
+SafeInt operator+(const int& left, const SafeInt& right)
+{
+ return SafeInt(left) + right;
+}
+
+SafeInt operator-(const int& left, const SafeInt& right)
+{
+ return SafeInt(left) - right;
+}
+
+SafeInt operator*(const int& left, const SafeInt& right)
+{
+ return SafeInt(left) * right;
+}
+
+SafeInt operator/(const int& left, const SafeInt& right)
+{
+ return SafeInt(left) / right;
+}
+
+SafeInt operator%(const int& left, const SafeInt& right)
+{
+ return SafeInt(left) % right;
+}
+
+SafeInt SafeInt::operator<<(const int offset)
+{
+ if (offset < 0)
+ {
+ shift_is_negative("SafeInt::operator<<(): ");
+ return *this >> -offset;
+ }
+
+ if ((c & (-1 << (sizeof(c)*8 - offset))) != 0)
+ integer_overflow("SafeInt::operator<<(): ");
+ return SafeInt(c << offset);
+}
+
+SafeInt SafeInt::operator>>(const int offset)
+{
+ if (offset < 0)
+ {
+ shift_is_negative("SafeInt::operator>>(): ");
+ return *this << -offset;
+ }
+
+ return SafeInt(c >> offset);
+}
+
+SafeInt& SafeInt::operator<<=(const int offset)
+{
+ *this = *this << offset;
+ return *this;
+}
+
+SafeInt& SafeInt::operator>>=(const int offset)
+{
+ *this = *this >> offset;
+ return *this;
+}
+
+const SafeInt SafeInt::zero = SafeInt(0);
+const SafeInt SafeInt::one = SafeInt(1);
+
+void *gmallocn(SafeInt nObjs, SafeInt objSize) GMEM_EXCEP {
+ SafeInt n;
- if (nObjs == 0) {
+ if (nObjs == SafeInt::create(0)) {
return NULL;
}
n = nObjs * objSize;
- if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
+ if (objSize <= SafeInt::create(0) || nObjs < SafeInt::create(0)) {
#if USE_EXCEPTIONS
throw GMemException();
#else
@@ -201,20 +522,20 @@
exit(1);
#endif
}
- return gmalloc(n);
+ return gmalloc(n.Int());
}
-void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP {
- int n;
+void *greallocn(void *p, SafeInt nObjs, SafeInt objSize) GMEM_EXCEP {
+ SafeInt n;
- if (nObjs == 0) {
+ if (nObjs == SafeInt::create(0)) {
if (p) {
gfree(p);
}
return NULL;
}
n = nObjs * objSize;
- if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
+ if (objSize <= SafeInt::create(0) || nObjs < SafeInt::create(0)) {
#if USE_EXCEPTIONS
throw GMemException();
#else
@@ -222,7 +543,7 @@
exit(1);
#endif
}
- return grealloc(p, n);
+ return grealloc(p, n.Int());
}
void gfree(void *p) {
--- xpdf-3.02/goo/gmem.h
+++ xpdf-3.02/goo/gmem.h
@@ -28,6 +28,98 @@
#endif // USE_EXCEPTIONS
+class SafeInt
+{
+ int c;
+
+public:
+ SafeInt();
+ SafeInt(const SafeInt& copy);
+ SafeInt(const long long int cA);
+ static SafeInt create(const long long int cA);
+ int Int(void) const;
+
+ const static SafeInt zero;
+ const static SafeInt one;
+
+ static void integer_overflow(const char * prefix = NULL);
+ static void division_by_zero(const char * prefix = NULL);
+ static void shift_is_negative(const char * prefix = NULL);
+
+ SafeInt& operator=(const int& cA);
+
+ bool operator==(const SafeInt& right) const;
+ bool operator!=(const SafeInt& right) const;
+ bool operator<(const SafeInt& right) const;
+ bool operator<=(const SafeInt& right) const;
+ bool operator >(const SafeInt& right) const;
+ bool operator >=(const SafeInt& right) const;
+
+ bool operator==(const int& right) const;
+ bool operator!=(const int& right) const;
+ bool operator<(const int& right) const;
+ bool operator<=(const int& right) const;
+ bool operator >(const int& right) const;
+ bool operator >=(const int& right) const;
+
+ friend bool operator ==(const int &left, const SafeInt& right);
+ friend bool operator !=(const int &left, const SafeInt& right);
+ friend bool operator <(const int &left, const SafeInt& right);
+ friend bool operator <=(const int &left, const SafeInt& right);
+ friend bool operator >(const int &left, const SafeInt& right);
+ friend bool operator >=(const int &left, const SafeInt& right);
+
+ SafeInt operator+() const;
+ SafeInt operator+(const SafeInt& right) const;
+ SafeInt operator-() const;
+ SafeInt operator-(const SafeInt& right) const;
+ SafeInt operator*(const SafeInt& right) const;
+ SafeInt operator/(const SafeInt& right) const;
+ SafeInt operator%(const SafeInt& right) const;
+
+ SafeInt operator/(const int& right) const;
+ SafeInt operator%(const int& right) const;
+
+ SafeInt& operator+=(const SafeInt& right);
+ SafeInt& operator-=(const SafeInt& right);
+ SafeInt& operator*=(const SafeInt& right);
+ SafeInt& operator/=(const SafeInt& right);
+ SafeInt& operator%=(const SafeInt& right);
+
+ SafeInt& operator/=(const int& right);
+ SafeInt& operator%=(const int& right);
+
+ friend SafeInt operator+(const int& left, const SafeInt& right);
+ friend SafeInt operator-(const int& left, const SafeInt& right);
+ friend SafeInt operator*(const int& left, const SafeInt& right);
+ friend SafeInt operator/(const int& left, const SafeInt& right);
+ friend SafeInt operator%(const int& left, const SafeInt& right);
+
+ SafeInt& operator++();
+ SafeInt operator++(int);
+ SafeInt& operator--();
+ SafeInt operator--(int);
+
+ SafeInt operator<<(const int offset);
+ SafeInt operator>>(const int offset);
+
+ SafeInt& operator<<=(const int offset);
+ SafeInt& operator>>=(const int offset);
+};
+
+bool operator==(const int& left, const SafeInt& right);
+bool operator!=(const int& left, const SafeInt& right);
+bool operator<(const int& left, const SafeInt& right);
+bool operator<=(const int& left, const SafeInt& right);
+bool operator>(const int& left, const SafeInt& right);
+bool operator>=(const int& left, const SafeInt& right);
+
+SafeInt operator+(const int& left, const SafeInt& right);
+SafeInt operator-(const int& left, const SafeInt& right);
+SafeInt operator*(const int& left, const SafeInt& right);
+SafeInt operator/(const int& left, const SafeInt& right);
+SafeInt operator%(const int& left, const SafeInt& right);
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -50,8 +142,8 @@
* bytes, but there is an additional error check that the total size
* doesn't overflow an int.
*/
-extern void *gmallocn(int nObjs, int objSize) GMEM_EXCEP;
-extern void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP;
+extern void *gmallocn(SafeInt nObjs, SafeInt objSize) GMEM_EXCEP;
+extern void *greallocn(void *p, SafeInt nObjs, SafeInt objSize) GMEM_EXCEP;
/*
* Same as free, but checks for and ignores NULL pointers.
--- xpdf-3.02/splash/Splash.cc
+++ xpdf-3.02/splash/Splash.cc
@@ -1912,7 +1912,7 @@
xq = w % scaledWidth;
// allocate pixel buffer
- pixBuf = (SplashColorPtr)gmalloc((yp + 1) * w);
+ pixBuf = (SplashColorPtr)gmalloc(((SafeInt(yp) + SafeInt(1)) * SafeInt(w)).Int());
// initialize the pixel pipe
pipeInit(&pipe, 0, 0, state->fillPattern, NULL, state->fillAlpha,
@@ -2208,9 +2208,9 @@
xq = w % scaledWidth;
// allocate pixel buffers
- colorBuf = (SplashColorPtr)gmalloc((yp + 1) * w * nComps);
+ colorBuf = (SplashColorPtr)gmalloc(((SafeInt(yp) + SafeInt(1)) * SafeInt(w) * SafeInt(nComps)).Int());
if (srcAlpha) {
- alphaBuf = (Guchar *)gmalloc((yp + 1) * w);
+ alphaBuf = (Guchar *)gmalloc(((SafeInt(yp) + SafeInt(1)) * SafeInt(w)).Int());
} else {
alphaBuf = NULL;
}
@@ -3064,7 +3064,7 @@
// draw the start cap
pathOut->moveTo(pathIn->pts[i].x - wdy, pathIn->pts[i].y + wdx);
if (i == subpathStart) {
- firstPt = pathOut->length - 1;
+ firstPt = pathOut->length.Int() - 1;
}
if (first && !closed) {
switch (state->lineCap) {
@@ -3099,7 +3099,7 @@
}
// draw the left side of the segment rectangle
- left2 = pathOut->length - 1;
+ left2 = pathOut->length.Int() - 1;
pathOut->lineTo(pathIn->pts[i+1].x + wdy, pathIn->pts[i+1].y - wdx);
// draw the end cap
@@ -3136,11 +3136,11 @@
}
// draw the right side of the segment rectangle
- right2 = pathOut->length - 1;
+ right2 = pathOut->length.Int() - 1;
pathOut->close();
// draw the join
- join2 = pathOut->length;
+ join2 = pathOut->length.Int();
if (!last || closed) {
crossprod = dx * dyNext - dy * dxNext;
dotprod = -(dx * dxNext + dy * dyNext);
@@ -3254,10 +3254,10 @@
if (i >= subpathStart + 2) {
pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0);
pathOut->addStrokeAdjustHint(left1, right1,
- join0, pathOut->length - 1);
+ join0, pathOut->length.Int() - 1);
} else {
pathOut->addStrokeAdjustHint(left1, right1,
- firstPt, pathOut->length - 1);
+ firstPt, pathOut->length.Int() - 1);
}
if (closed) {
pathOut->addStrokeAdjustHint(left1, right1, firstPt, leftFirst);
@@ -3266,7 +3266,7 @@
pathOut->addStrokeAdjustHint(leftFirst, rightFirst,
left1 + 1, right1);
pathOut->addStrokeAdjustHint(leftFirst, rightFirst,
- join1, pathOut->length - 1);
+ join1, pathOut->length.Int() - 1);
}
}
}
--- xpdf-3.02/splash/SplashBitmap.cc
+++ xpdf-3.02/splash/SplashBitmap.cc
@@ -44,13 +44,13 @@
}
rowSize += rowPad - 1;
rowSize -= rowSize % rowPad;
- data = (SplashColorPtr)gmalloc(rowSize * height);
+ data = (SplashColorPtr)gmallocn(rowSize, height);
if (!topDown) {
data += (height - 1) * rowSize;
rowSize = -rowSize;
}
if (alphaA) {
- alpha = (Guchar *)gmalloc(width * height);
+ alpha = (Guchar *)gmallocn(width, height);
} else {
alpha = NULL;
}
--- xpdf-3.02/splash/SplashClip.cc
+++ xpdf-3.02/splash/SplashClip.cc
@@ -55,7 +55,8 @@
paths = NULL;
flags = NULL;
scanners = NULL;
- length = size = 0;
+ length = 0;
+ size = 0;
}
SplashClip::SplashClip(SplashClip *clip) {
@@ -124,7 +125,8 @@
paths = NULL;
flags = NULL;
scanners = NULL;
- length = size = 0;
+ length = 0;
+ size = 0;
if (x0 < x1) {
xMin = x0;
--- xpdf-3.02/splash/SplashClip.h
+++ xpdf-3.02/splash/SplashClip.h
@@ -101,7 +101,8 @@
SplashXPath **paths;
Guchar *flags;
SplashXPathScanner **scanners;
- int length, size;
+ int length;
+ SafeInt size;
};
#endif
--- xpdf-3.02/splash/SplashFTFont.cc
+++ xpdf-3.02/splash/SplashFTFont.cc
@@ -157,7 +157,7 @@
FT_Vector offset;
FT_GlyphSlot slot;
FT_UInt gid;
- int rowSize;
+ SafeInt rowSize;
Guchar *p, *q;
int i;
@@ -210,14 +210,14 @@
if (aa) {
rowSize = bitmap->w;
} else {
- rowSize = (bitmap->w + 7) >> 3;
+ rowSize = (SafeInt(bitmap->w) + SafeInt(7)) >> 3;
}
- bitmap->data = (Guchar *)gmalloc(rowSize * bitmap->h);
+ bitmap->data = (Guchar *)gmallocn(rowSize, bitmap->h);
bitmap->freeData = gTrue;
for (i = 0, p = bitmap->data, q = slot->bitmap.buffer;
i < bitmap->h;
- ++i, p += rowSize, q += slot->bitmap.pitch) {
- memcpy(p, q, rowSize);
+ ++i, p += rowSize.Int(), q += slot->bitmap.pitch) {
+ memcpy(p, q, rowSize.Int());
}
return gTrue;
--- xpdf-3.02/splash/SplashFTFontEngine.cc
+++ xpdf-3.02/splash/SplashFTFontEngine.cc
@@ -91,7 +91,7 @@
GBool deleteFile) {
FoFiType1C *ff;
Gushort *cidToGIDMap;
- int nCIDs;
+ SafeInt nCIDs;
SplashFontFile *ret;
// check for a CFF font
@@ -106,7 +106,7 @@
nCIDs = 0;
}
ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile,
- cidToGIDMap, nCIDs);
+ cidToGIDMap, nCIDs.Int());
if (!ret) {
gfree(cidToGIDMap);
}
@@ -119,7 +119,7 @@
FoFiTrueType *ff;
GBool isCID;
Gushort *cidToGIDMap;
- int nCIDs;
+ SafeInt nCIDs;
SplashFontFile *ret;
cidToGIDMap = NULL;
@@ -134,7 +134,7 @@
}
}
ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile,
- cidToGIDMap, nCIDs);
+ cidToGIDMap, nCIDs.Int());
if (!ret) {
gfree(cidToGIDMap);
}
--- xpdf-3.02/splash/SplashFont.cc
+++ xpdf-3.02/splash/SplashFont.cc
@@ -78,7 +78,7 @@
cacheTags = (SplashFontCacheTag *)gmallocn(cacheSets * cacheAssoc,
sizeof(SplashFontCacheTag));
for (i = 0; i < cacheSets * cacheAssoc; ++i) {
- cacheTags[i].mru = i & (cacheAssoc - 1);
+ cacheTags[i].mru = i & (cacheAssoc.Int() - 1);
}
}
@@ -106,7 +106,7 @@
}
// check the cache
- i = (c & (cacheSets - 1)) * cacheAssoc;
+ i = (c & (cacheSets.Int() - 1)) * cacheAssoc.Int();
for (j = 0; j < cacheAssoc; ++j) {
if ((cacheTags[i+j].mru & 0x80000000) &&
cacheTags[i+j].c == c &&
@@ -151,7 +151,7 @@
}
p = NULL; // make gcc happy
for (j = 0; j < cacheAssoc; ++j) {
- if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc - 1) {
+ if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc.Int() - 1) {
cacheTags[i+j].mru = 0x80000000;
cacheTags[i+j].c = c;
cacheTags[i+j].xFrac = (short)xFrac;
--- xpdf-3.02/splash/SplashFont.h
+++ xpdf-3.02/splash/SplashFont.h
@@ -97,8 +97,8 @@
cacheTags;
int glyphW, glyphH; // size of glyph bitmaps
int glyphSize; // size of glyph bitmaps, in bytes
- int cacheSets; // number of sets in cache
- int cacheAssoc; // cache associativity (glyphs per set)
+ SafeInt cacheSets; // number of sets in cache
+ SafeInt cacheAssoc; // cache associativity (glyphs per set)
};
#endif
--- xpdf-3.02/splash/SplashPath.cc
+++ xpdf-3.02/splash/SplashPath.cc
@@ -44,13 +44,13 @@
size = path->size;
pts = (SplashPathPoint *)gmallocn(size, sizeof(SplashPathPoint));
flags = (Guchar *)gmallocn(size, sizeof(Guchar));
- memcpy(pts, path->pts, length * sizeof(SplashPathPoint));
- memcpy(flags, path->flags, length * sizeof(Guchar));
+ memcpy(pts, path->pts, length.Int() * sizeof(SplashPathPoint));
+ memcpy(flags, path->flags, length.Int() * sizeof(Guchar));
curSubpath = path->curSubpath;
if (path->hints) {
hintsLength = hintsSize = path->hintsLength;
hints = (SplashPathHint *)gmallocn(hintsSize, sizeof(SplashPathHint));
- memcpy(hints, path->hints, hintsLength * sizeof(SplashPathHint));
+ memcpy(hints, path->hints, hintsLength.Int() * sizeof(SplashPathHint));
} else {
hints = NULL;
}
@@ -79,11 +79,11 @@
void SplashPath::append(SplashPath *path) {
int i;
- curSubpath = length + path->curSubpath;
- grow(path->length);
+ curSubpath = length.Int() + path->curSubpath;
+ grow(path->length.Int());
for (i = 0; i < path->length; ++i) {
- pts[length] = path->pts[i];
- flags[length] = path->flags[i];
+ pts[length.Int()] = path->pts[i];
+ flags[length.Int()] = path->flags[i];
++length;
}
}
@@ -93,10 +93,10 @@
return splashErrBogusPath;
}
grow(1);
- pts[length].x = x;
- pts[length].y = y;
- flags[length] = splashPathFirst | splashPathLast;
- curSubpath = length++;
+ pts[length.Int()].x = x;
+ pts[length.Int()].y = y;
+ flags[length.Int()] = splashPathFirst | splashPathLast;
+ curSubpath = (length++).Int();
return splashOk;
}
@@ -104,11 +104,11 @@
if (noCurrentPoint()) {
return splashErrNoCurPt;
}
- flags[length-1] &= ~splashPathLast;
+ flags[(length-1).Int()] &= ~splashPathLast;
grow(1);
- pts[length].x = x;
- pts[length].y = y;
- flags[length] = splashPathLast;
+ pts[length.Int()].x = x;
+ pts[length.Int()].y = y;
+ flags[length.Int()] = splashPathLast;
++length;
return splashOk;
}
@@ -119,19 +119,19 @@
if (noCurrentPoint()) {
return splashErrNoCurPt;
}
- flags[length-1] &= ~splashPathLast;
+ flags[(length-1).Int()] &= ~splashPathLast;
grow(3);
- pts[length].x = x1;
- pts[length].y = y1;
- flags[length] = splashPathCurve;
+ pts[length.Int()].x = x1;
+ pts[length.Int()].y = y1;
+ flags[length.Int()] = splashPathCurve;
++length;
- pts[length].x = x2;
- pts[length].y = y2;
- flags[length] = splashPathCurve;
+ pts[length.Int()].x = x2;
+ pts[length.Int()].y = y2;
+ flags[length.Int()] = splashPathCurve;
++length;
- pts[length].x = x3;
- pts[length].y = y3;
- flags[length] = splashPathLast;
+ pts[length.Int()].x = x3;
+ pts[length.Int()].y = y3;
+ flags[length.Int()] = splashPathLast;
++length;
return splashOk;
}
@@ -140,28 +140,28 @@
if (noCurrentPoint()) {
return splashErrNoCurPt;
}
- if (curSubpath == length - 1 ||
- pts[length - 1].x != pts[curSubpath].x ||
- pts[length - 1].y != pts[curSubpath].y) {
+ if (curSubpath == length.Int() - 1 ||
+ pts[length.Int() - 1].x != pts[curSubpath].x ||
+ pts[length.Int() - 1].y != pts[curSubpath].y) {
lineTo(pts[curSubpath].x, pts[curSubpath].y);
}
flags[curSubpath] |= splashPathClosed;
- flags[length - 1] |= splashPathClosed;
- curSubpath = length;
+ flags[length.Int() - 1] |= splashPathClosed;
+ curSubpath = length.Int();
return splashOk;
}
void SplashPath::addStrokeAdjustHint(int ctrl0, int ctrl1,
int firstPt, int lastPt) {
if (hintsLength == hintsSize) {
- hintsSize = hintsLength ? 2 * hintsLength : 8;
+ hintsSize = hintsLength.Int() ? 2 * hintsLength : 8;
hints = (SplashPathHint *)greallocn(hints, hintsSize,
sizeof(SplashPathHint));
}
- hints[hintsLength].ctrl0 = ctrl0;
- hints[hintsLength].ctrl1 = ctrl1;
- hints[hintsLength].firstPt = firstPt;
- hints[hintsLength].lastPt = lastPt;
+ hints[hintsLength.Int()].ctrl0 = ctrl0;
+ hints[hintsLength.Int()].ctrl1 = ctrl1;
+ hints[hintsLength.Int()].firstPt = firstPt;
+ hints[hintsLength.Int()].lastPt = lastPt;
++hintsLength;
}
@@ -178,7 +178,7 @@
if (noCurrentPoint()) {
return gFalse;
}
- *x = pts[length - 1].x;
- *y = pts[length - 1].y;
+ *x = pts[length.Int() - 1].x;
+ *y = pts[length.Int() - 1].y;
return gTrue;
}
--- xpdf-3.02/splash/SplashPath.h
+++ xpdf-3.02/splash/SplashPath.h
@@ -91,7 +91,7 @@
void offset(SplashCoord dx, SplashCoord dy);
// Get the points on the path.
- int getLength() { return length; }
+ int getLength() { return length.Int(); }
void getPoint(int i, double *x, double *y, Guchar *f)
{ *x = pts[i].x; *y = pts[i].y; *f = flags[i]; }
@@ -108,11 +108,11 @@
SplashPathPoint *pts; // array of points
Guchar *flags; // array of flags
- int length, size; // length/size of the pts and flags arrays
+ SafeInt length, size; // length/size of the pts and flags arrays
int curSubpath; // index of first point in last subpath
SplashPathHint *hints; // list of hints
- int hintsLength, hintsSize;
+ SafeInt hintsLength, hintsSize;
friend class SplashXPath;
friend class Splash;
--- xpdf-3.02/splash/SplashScreen.cc
+++ xpdf-3.02/splash/SplashScreen.cc
@@ -12,7 +12,6 @@
#include <stdlib.h>
#include <string.h>
-#include "gmem.h"
#include "SplashMath.h"
#include "SplashScreen.h"
@@ -61,7 +60,7 @@
// size must be a power of 2
for (size = 1; size < params->size; size <<= 1) ;
mat = (Guchar *)gmallocn(size * size, sizeof(Guchar));
- buildDispersedMatrix(size/2, size/2, 1, size/2, 1);
+ buildDispersedMatrix((size/2).Int(), (size/2).Int(), 1, (size/2).Int(), 1);
break;
case splashScreenClustered:
@@ -76,8 +75,8 @@
case splashScreenStochasticClustered:
// size must be at least 2*r
- if (params->size < 2 * params->dotRadius) {
- size = 2 * params->dotRadius;
+ if (SafeInt(params->size) < 2 * SafeInt(params->dotRadius)) {
+ size = 2 * SafeInt(params->dotRadius);
} else {
size = params->size;
}
@@ -118,15 +117,15 @@
int delta, int offset) {
if (delta == 0) {
// map values in [1, size^2] --> [1, 255]
- mat[i * size + j] = 1 + (254 * (val - 1)) / (size * size - 1);
+ mat[i * size.Int() + j] = 1 + (254 * (val - 1)) / (size.Int() * size.Int() - 1);
} else {
buildDispersedMatrix(i, j,
val, delta / 2, 4*offset);
- buildDispersedMatrix((i + delta) % size, (j + delta) % size,
+ buildDispersedMatrix((i + delta) % size.Int(), (j + delta) % size.Int(),
val + offset, delta / 2, 4*offset);
- buildDispersedMatrix((i + delta) % size, j,
+ buildDispersedMatrix((i + delta) % size.Int(), j,
val + 2*offset, delta / 2, 4*offset);
- buildDispersedMatrix((i + 2*delta) % size, (j + delta) % size,
+ buildDispersedMatrix((i + 2*delta) % size.Int(), (j + delta) % size.Int(),
val + 3*offset, delta / 2, 4*offset);
}
}
@@ -135,14 +134,15 @@
SplashCoord *dist;
SplashCoord u, v, d;
Guchar val;
- int size2, x, y, x1, y1, i;
+ SafeInt size2;
+ int x, y, x1, y1, i;
size2 = size >> 1;
// initialize the threshold matrix
for (y = 0; y < size; ++y) {
for (x = 0; x < size; ++x) {
- mat[y * size + x] = 0;
+ mat[y * size.Int() + x] = 0;
}
}
@@ -154,22 +154,22 @@
u = (SplashCoord)x + 0.5 - 0;
v = (SplashCoord)y + 0.5 - 0;
} else {
- u = (SplashCoord)x + 0.5 - (SplashCoord)size2;
- v = (SplashCoord)y + 0.5 - (SplashCoord)size2;
+ u = (SplashCoord)x + 0.5 - (SplashCoord)size2.Int();
+ v = (SplashCoord)y + 0.5 - (SplashCoord)size2.Int();
}
- dist[y * size2 + x] = u*u + v*v;
+ dist[y * size2.Int() + x] = u*u + v*v;
}
}
for (y = 0; y < size2; ++y) {
for (x = 0; x < size2; ++x) {
if (x < y) {
u = (SplashCoord)x + 0.5 - 0;
- v = (SplashCoord)y + 0.5 - (SplashCoord)size2;
+ v = (SplashCoord)y + 0.5 - (SplashCoord)size2.Int();
} else {
- u = (SplashCoord)x + 0.5 - (SplashCoord)size2;
+ u = (SplashCoord)x + 0.5 - (SplashCoord)size2.Int();
v = (SplashCoord)y + 0.5 - 0;
}
- dist[(size2 + y) * size2 + x] = u*u + v*v;
+ dist[(size2.Int() + y) * size2.Int() + x] = u*u + v*v;
}
}
@@ -181,22 +181,22 @@
d = -1;
for (y = 0; y < size; ++y) {
for (x = 0; x < size2; ++x) {
- if (mat[y * size + x] == 0 &&
- dist[y * size2 + x] > d) {
+ if (mat[y * size.Int() + x] == 0 &&
+ dist[y * size2.Int() + x] > d) {
x1 = x;
y1 = y;
- d = dist[y1 * size2 + x1];
+ d = dist[y1 * size2.Int() + x1];
}
}
}
// map values in [0, 2*size*size2-1] --> [1, 255]
- val = 1 + (254 * (2*i)) / (2*size*size2 - 1);
- mat[y1 * size + x1] = val;
- val = 1 + (254 * (2*i+1)) / (2*size*size2 - 1);
- if (y1 < size2) {
- mat[(y1 + size2) * size + x1 + size2] = val;
+ val = 1 + (254 * (2*i)) / (2*size.Int()*size2.Int() - 1);
+ mat[y1 * size.Int() + x1] = val;
+ val = 1 + (254 * (2*i+1)) / (2*size.Int()*size2.Int() - 1);
+ if (y1 < size2.Int()) {
+ mat[(y1 + size2.Int()) * size.Int() + x1 + size2.Int()] = val;
} else {
- mat[(y1 - size2) * size + x1 + size2] = val;
+ mat[(y1 - size2.Int()) * size.Int() + x1 + size2.Int()] = val;
}
}
@@ -208,10 +208,10 @@
int dx0, dx1, dx, dy0, dy1, dy;
dx0 = abs(x0 - x1);
- dx1 = size - dx0;
+ dx1 = size.Int() - dx0;
dx = dx0 < dx1 ? dx0 : dx1;
dy0 = abs(y0 - y1);
- dy1 = size - dy0;
+ dy1 = size.Int() - dy0;
dy = dy0 < dy1 ? dy0 : dy1;
return dx * dx + dy * dy;
}
@@ -222,7 +222,7 @@
// Hardcopy, and Graphic Arts IV, SPIE Vol. 3648, pp. 496-505, 1999.
void SplashScreen::buildSCDMatrix(int r) {
SplashScreenPoint *dots, *pts;
- int dotsLen, dotsSize;
+ SafeInt dotsLen, dotsSize;
char *tmpl;
char *grid;
int *region, *dist;
@@ -242,7 +242,7 @@
}
}
for (i = 0; i < size * size; ++i) {
- j = i + (int)((double)(size * size - i) *
+ j = i + (int)((double)(size.Int() * size.Int() - i) *
(double)rand() / ((double)RAND_MAX + 1.0));
x = pts[i].x;
y = pts[i].y;
@@ -253,7 +253,7 @@
}
// construct the circle template
- tmpl = (char *)gmallocn((r+1)*(r+1), sizeof(char));
+ tmpl = (char *)gmallocn((SafeInt(r)+SafeInt(1))*(SafeInt(r)+SafeInt(1)), sizeof(char));
for (y = 0; y <= r; ++y) {
for (x = 0; x <= r; ++x) {
tmpl[y*(r+1) + x] = (x * y <= r * r) ? 1 : 0;
@@ -264,7 +264,7 @@
grid = (char *)gmallocn(size * size, sizeof(char));
for (y = 0; y < size; ++y) {
for (x = 0; x < size; ++x) {
- grid[y*size + x] = 0;
+ grid[y*size.Int() + x] = 0;
}
}
@@ -272,27 +272,27 @@
dotsLen = 0;
dotsSize = 32;
dots = (SplashScreenPoint *)gmallocn(dotsSize, sizeof(SplashScreenPoint));
- for (i = 0; i < size * size; ++i) {
+ for (i = 0; i < size.Int() * size.Int(); ++i) {
x = pts[i].x;
y = pts[i].y;
- if (!grid[y*size + x]) {
+ if (!grid[y*size.Int() + x]) {
if (dotsLen == dotsSize) {
dotsSize *= 2;
dots = (SplashScreenPoint *)greallocn(dots, dotsSize,
sizeof(SplashScreenPoint));
}
- dots[dotsLen++] = pts[i];
+ dots[(dotsLen++).Int()] = pts[i];
for (yy = 0; yy <= r; ++yy) {
- y0 = (y + yy) % size;
- y1 = (y - yy + size) % size;
+ y0 = (y + yy) % size.Int();
+ y1 = (y - yy + size.Int()) % size.Int();
for (xx = 0; xx <= r; ++xx) {
if (tmpl[yy*(r+1) + xx]) {
- x0 = (x + xx) % size;
- x1 = (x - xx + size) % size;
- grid[y0*size + x0] = 1;
- grid[y0*size + x1] = 1;
- grid[y1*size + x0] = 1;
- grid[y1*size + x1] = 1;
+ x0 = (x + xx) % size.Int();
+ x1 = (x - xx + size.Int()) % size.Int();
+ grid[y0*size.Int() + x0] = 1;
+ grid[y0*size.Int() + x1] = 1;
+ grid[y1*size.Int() + x0] = 1;
+ grid[y1*size.Int() + x1] = 1;
}
}
}
@@ -316,17 +316,17 @@
dMin = d;
}
}
- region[y*size + x] = iMin;
- dist[y*size + x] = dMin;
+ region[y*size.Int() + x] = iMin;
+ dist[y*size.Int() + x] = dMin;
}
}
// compute threshold values
for (i = 0; i < dotsLen; ++i) {
n = 0;
- for (y = 0; y < size; ++y) {
- for (x = 0; x < size; ++x) {
- if (region[y*size + x] == i) {
+ for (y = 0; y < size.Int(); ++y) {
+ for (x = 0; x < size.Int(); ++x) {
+ if (region[y*size.Int() + x] == i) {
pts[n].x = x;
pts[n].y = y;
pts[n].dist = distance(dots[i].x, dots[i].y, x, y);
@@ -337,7 +337,7 @@
qsort(pts, n, sizeof(SplashScreenPoint), &cmpDistances);
for (j = 0; j < n; ++j) {
// map values in [0 .. n-1] --> [255 .. 1]
- mat[pts[j].y * size + pts[j].x] = 255 - (254 * j) / (n - 1);
+ mat[pts[j].y * size.Int() + pts[j].x] = 255 - (254 * j) / (n - 1);
}
}
@@ -351,7 +351,7 @@
SplashScreen::SplashScreen(SplashScreen *screen) {
size = screen->size;
mat = (Guchar *)gmallocn(size * size, sizeof(Guchar));
- memcpy(mat, screen->mat, size * size * sizeof(Guchar));
+ memcpy(mat, screen->mat, (size * size).Int() * sizeof(Guchar));
minVal = screen->minVal;
maxVal = screen->maxVal;
}
@@ -369,13 +369,13 @@
if (value >= maxVal) {
return 1;
}
- if ((xx = x % size) < 0) {
+ if ((xx = x % size.Int()) < 0) {
xx = -xx;
}
- if ((yy = y % size) < 0) {
+ if ((yy = y % size.Int()) < 0) {
yy = -yy;
}
- return value < mat[yy * size + xx] ? 0 : 1;
+ return value < mat[yy * size.Int() + xx] ? 0 : 1;
}
GBool SplashScreen::isStatic(Guchar value) {
--- xpdf-3.02/splash/SplashScreen.h
+++ xpdf-3.02/splash/SplashScreen.h
@@ -14,11 +14,14 @@
#endif
#include "SplashTypes.h"
+#include "gmem.h"
//------------------------------------------------------------------------
// SplashScreen
//------------------------------------------------------------------------
+class SafeInt;
+
class SplashScreen {
public:
@@ -46,7 +49,7 @@
void buildSCDMatrix(int r);
Guchar *mat; // threshold matrix
- int size; // size of the threshold matrix
+ SafeInt size; // size of the threshold matrix
Guchar minVal; // any pixel value below minVal generates
// solid black
Guchar maxVal; // any pixel value above maxVal generates
--- xpdf-3.02/splash/SplashT1Font.cc
+++ xpdf-3.02/splash/SplashT1Font.cc
@@ -183,7 +183,8 @@
GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac,
SplashGlyphBitmap *bitmap) {
GLYPH *glyph;
- int n, i;
+ int i;
+ SafeInt n;
if (aa) {
glyph = T1_AASetChar(t1libID, c, size, NULL);
@@ -203,7 +204,7 @@
bitmap->data = (Guchar *)glyph->bits;
bitmap->freeData = gFalse;
} else {
- n = bitmap->h * ((bitmap->w + 7) >> 3);
+ n = SafeInt(bitmap->h) * ((SafeInt(bitmap->w) + SafeInt(7)) >> SafeInt(3));
bitmap->data = (Guchar *)gmalloc(n);
for (i = 0; i < n; ++i) {
bitmap->data[i] = bitReverse[glyph->bits[i] & 0xff];
--- xpdf-3.02/splash/SplashT1FontFile.cc
+++ xpdf-3.02/splash/SplashT1FontFile.cc
@@ -31,7 +31,7 @@
int t1libIDA;
char **encTmp;
char *encStrTmp;
- int encStrSize;
+ SafeInt encStrSize;
char *encPtr;
int i;
@@ -45,7 +45,7 @@
encStrSize = 0;
for (i = 0; i < 256; ++i) {
if (encA[i]) {
- encStrSize += strlen(encA[i]) + 1;
+ encStrSize += SafeInt(strlen(encA[i])) + SafeInt(1);
}
}
encTmp = (char **)gmallocn(257, sizeof(char *));
--- xpdf-3.02/splash/SplashXPath.cc
+++ xpdf-3.02/splash/SplashXPath.cc
@@ -147,7 +147,7 @@
xsp = x0;
ysp = y0;
curSubpath = i;
- curSubpathX = length;
+ curSubpathX = length.Int();
++i;
} else {
@@ -236,7 +236,7 @@
length = xPath->length;
size = xPath->size;
segs = (SplashXPathSeg *)gmallocn(size, sizeof(SplashXPathSeg));
- memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg));
+ memcpy(segs, xPath->segs, length.Int() * sizeof(SplashXPathSeg));
}
SplashXPath::~SplashXPath() {
@@ -344,51 +344,51 @@
SplashCoord x1, SplashCoord y1,
GBool first, GBool last, GBool end0, GBool end1) {
grow(1);
- segs[length].x0 = x0;
- segs[length].y0 = y0;
- segs[length].x1 = x1;
- segs[length].y1 = y1;
- segs[length].flags = 0;
+ segs[length.Int()].x0 = x0;
+ segs[length.Int()].y0 = y0;
+ segs[length.Int()].x1 = x1;
+ segs[length.Int()].y1 = y1;
+ segs[length.Int()].flags = 0;
if (first) {
- segs[length].flags |= splashXPathFirst;
+ segs[length.Int()].flags |= splashXPathFirst;
}
if (last) {
- segs[length].flags |= splashXPathLast;
+ segs[length.Int()].flags |= splashXPathLast;
}
if (end0) {
- segs[length].flags |= splashXPathEnd0;
+ segs[length.Int()].flags |= splashXPathEnd0;
}
if (end1) {
- segs[length].flags |= splashXPathEnd1;
+ segs[length.Int()].flags |= splashXPathEnd1;
}
if (y1 == y0) {
- segs[length].dxdy = segs[length].dydx = 0;
- segs[length].flags |= splashXPathHoriz;
+ segs[length.Int()].dxdy = segs[length.Int()].dydx = 0;
+ segs[length.Int()].flags |= splashXPathHoriz;
if (x1 == x0) {
- segs[length].flags |= splashXPathVert;
+ segs[length.Int()].flags |= splashXPathVert;
}
} else if (x1 == x0) {
- segs[length].dxdy = segs[length].dydx = 0;
- segs[length].flags |= splashXPathVert;
+ segs[length.Int()].dxdy = segs[length.Int()].dydx = 0;
+ segs[length.Int()].flags |= splashXPathVert;
} else {
#if USE_FIXEDPOINT
- if (FixedPoint::divCheck(x1 - x0, y1 - y0, &segs[length].dxdy)) {
- segs[length].dydx = (SplashCoord)1 / segs[length].dxdy;
+ if (FixedPoint::divCheck(x1 - x0, y1 - y0, &segs[length.Int()].dxdy)) {
+ segs[length.Int()].dydx = (SplashCoord)1 / segs[length.Int()].dxdy;
} else {
- segs[length].dxdy = segs[length].dydx = 0;
+ segs[length.Int()].dxdy = segs[length.Int()].dydx = 0;
if (splashAbs(x1 - x0) > splashAbs(y1 - y0)) {
- segs[length].flags |= splashXPathHoriz;
+ segs[length.Int()].flags |= splashXPathHoriz;
} else {
- segs[length].flags |= splashXPathVert;
+ segs[length.Int()].flags |= splashXPathVert;
}
}
#else
- segs[length].dxdy = (x1 - x0) / (y1 - y0);
- segs[length].dydx = (SplashCoord)1 / segs[length].dxdy;
+ segs[length.Int()].dxdy = (x1 - x0) / (y1 - y0);
+ segs[length.Int()].dydx = (SplashCoord)1 / segs[length.Int()].dxdy;
#endif
}
if (y0 > y1) {
- segs[length].flags |= splashXPathFlip;
+ segs[length.Int()].flags |= splashXPathFlip;
}
++length;
}
@@ -434,5 +434,5 @@
}
void SplashXPath::sort() {
- qsort(segs, length, sizeof(SplashXPathSeg), &cmpXPathSegs);
+ qsort(segs, length.Int(), sizeof(SplashXPathSeg), &cmpXPathSegs);
}
--- xpdf-3.02/splash/SplashXPath.h
+++ xpdf-3.02/splash/SplashXPath.h
@@ -90,7 +90,7 @@
GBool first, GBool last, GBool end0, GBool end1);
SplashXPathSeg *segs;
- int length, size; // length and size of segs array
+ SafeInt length, size; // length and size of segs array
friend class SplashXPathScanner;
friend class SplashClip;
--- xpdf-3.02/splash/SplashXPathScanner.cc
+++ xpdf-3.02/splash/SplashXPathScanner.cc
@@ -92,7 +92,8 @@
interY = yMin - 1;
xPathIdx = 0;
inter = NULL;
- interLen = interSize = 0;
+ interLen = 0;
+ interSize = 0;
}
SplashXPathScanner::~SplashXPathScanner() {
--- xpdf-3.02/splash/SplashXPathScanner.h
+++ xpdf-3.02/splash/SplashXPathScanner.h
@@ -81,7 +81,7 @@
// computeIntersections
SplashIntersect *inter; // intersections array for <interY>
int interLen; // number of intersections in <inter>
- int interSize; // size of the <inter> array
+ SafeInt interSize; // size of the <inter> array
};
#endif
--- xpdf-3.02/xpdf/Annot.cc
+++ xpdf-3.02/xpdf/Annot.cc
@@ -1437,7 +1437,7 @@
Annot *annot;
Object obj1;
Ref ref;
- int size;
+ SafeInt size;
int i;
annots = NULL;
--- xpdf-3.02/xpdf/Array.cc
+++ xpdf-3.02/xpdf/Array.cc
@@ -46,7 +46,7 @@
}
elems = (Object *)greallocn(elems, size, sizeof(Object));
}
- elems[length] = *elem;
+ elems[length.Int()] = *elem;
++length;
}
--- xpdf-3.02/xpdf/Array.h
+++ xpdf-3.02/xpdf/Array.h
@@ -37,7 +37,7 @@
int decRef() { return --ref; }
// Get number of elements.
- int getLength() { return length; }
+ int getLength() { return length.Int(); }
// Add an element.
void add(Object *elem);
@@ -50,8 +50,8 @@
XRef *xref; // the xref table for this PDF file
Object *elems; // array of elements
- int size; // size of <elems> array
- int length; // number of elements in array
+ SafeInt size; // size of <elems> array
+ SafeInt length; // number of elements in array
int ref; // reference count
};
--- xpdf-3.02/xpdf/Catalog.cc
+++ xpdf-3.02/xpdf/Catalog.cc
@@ -38,7 +38,7 @@
xref = xrefA;
pages = NULL;
pageRefs = NULL;
- numPages = pagesSize = 0;
+ pagesSize = numPages = 0;
baseURI = NULL;
xref->getCatalog(&catDict);
@@ -219,7 +219,7 @@
pagesSize += 32;
pages = (Page **)greallocn(pages, pagesSize, sizeof(Page *));
pageRefs = (Ref *)greallocn(pageRefs, pagesSize, sizeof(Ref));
- for (j = pagesSize - 32; j < pagesSize; ++j) {
+ for (j = (pagesSize - 32).Int(); j < pagesSize; ++j) {
pages[j] = NULL;
pageRefs[j].num = -1;
pageRefs[j].gen = -1;
--- xpdf-3.02/xpdf/Catalog.h
+++ xpdf-3.02/xpdf/Catalog.h
@@ -79,7 +79,7 @@
Page **pages; // array of pages
Ref *pageRefs; // object ID for each page
int numPages; // number of pages
- int pagesSize; // size of pages array
+ SafeInt pagesSize; // size of pages array
Object dests; // named destination dictionary
Object nameTree; // name tree
GString *baseURI; // base URI for URI-type links
--- xpdf-3.02/xpdf/CharCodeToUnicode.cc
+++ xpdf-3.02/xpdf/CharCodeToUnicode.cc
@@ -58,7 +58,8 @@
GString *collection) {
FILE *f;
Unicode *mapA;
- CharCode size, mapLenA;
+ CharCode mapLenA;
+ SafeInt size;
char buf[64];
Unicode u;
CharCodeToUnicode *ctu;
@@ -100,7 +101,8 @@
FILE *f;
Unicode *mapA;
CharCodeToUnicodeString *sMapA;
- CharCode size, oldSize, len, sMapSizeA, sMapLenA;
+ CharCode len, sMapLenA;
+ SafeInt size, oldSize, sMapSizeA;
char buf[256];
char *tok;
Unicode u0;
@@ -116,7 +118,7 @@
size = 4096;
mapA = (Unicode *)gmallocn(size, sizeof(Unicode));
- memset(mapA, 0, size * sizeof(Unicode));
+ memset(mapA, 0, size.Int() * sizeof(Unicode));
len = 0;
sMapA = NULL;
sMapSizeA = sMapLenA = 0;
@@ -153,7 +155,7 @@
size *= 2;
}
mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode));
- memset(mapA + oldSize, 0, (size - oldSize) * sizeof(Unicode));
+ memset(mapA + oldSize.Int(), 0, (size - oldSize).Int() * sizeof(Unicode));
}
if (n == 1) {
mapA[u0] = uBuf[0];
@@ -178,7 +180,7 @@
fclose(f);
ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue,
- sMapA, sMapLenA, sMapSizeA);
+ sMapA, sMapLenA, sMapSizeA.Int());
gfree(mapA);
return ctu;
}
@@ -319,7 +321,7 @@
if (code >= mapLen) {
oldLen = mapLen;
- mapLen = (code + 256) & ~255;
+ mapLen = (SafeInt(code) + 256).Int() & ~255;
map = (Unicode *)greallocn(map, mapLen, sizeof(Unicode));
for (i = oldLen; i < mapLen; ++i) {
map[i] = 0;
@@ -362,7 +364,7 @@
map[i] = 0;
}
sMap = NULL;
- sMapLen = sMapSize = 0;
+ sMapSize = sMapLen = 0;
refCnt = 1;
#if MULTITHREADED
gInitMutex(&mutex);
--- xpdf-3.02/xpdf/CharCodeToUnicode.h
+++ xpdf-3.02/xpdf/CharCodeToUnicode.h
@@ -87,7 +87,8 @@
Unicode *map;
CharCode mapLen;
CharCodeToUnicodeString *sMap;
- int sMapLen, sMapSize;
+ int sMapLen;
+ SafeInt sMapSize;
int refCnt;
#if MULTITHREADED
GMutex mutex;
--- xpdf-3.02/xpdf/Decrypt.cc
+++ xpdf-3.02/xpdf/Decrypt.cc
@@ -113,7 +113,7 @@
GBool ok;
// generate file key
- buf = (Guchar *)gmalloc(72 + fileID->getLength());
+ buf = (Guchar *)gmalloc((SafeInt(72) + SafeInt(fileID->getLength())).Int());
if (userPassword) {
len = userPassword->getLength();
if (len < 32) {
--- xpdf-3.02/xpdf/Dict.h
+++ xpdf-3.02/xpdf/Dict.h
@@ -67,7 +67,7 @@
XRef *xref; // the xref table for this PDF file
DictEntry *entries; // array of entries
- int size; // size of <entries> array
+ SafeInt size; // size of <entries> array
int length; // number of entries in dictionary
int ref; // reference count
--- xpdf-3.02/xpdf/Function.cc
+++ xpdf-3.02/xpdf/Function.cc
@@ -212,7 +212,7 @@
}
//----- buffer
- sBuf = (double *)gmallocn(1 << m, sizeof(double));
+ sBuf = (double *)gmallocn((SafeInt(1) << m).Int(), sizeof(double));
//----- get the stream
if (!funcObj->isStream()) {
@@ -364,8 +364,8 @@
SampledFunction::SampledFunction(SampledFunction *func) {
memcpy(this, func, sizeof(SampledFunction));
samples = (double *)gmallocn(nSamples, sizeof(double));
- memcpy(samples, func->samples, nSamples * sizeof(double));
- sBuf = (double *)gmallocn(1 << m, sizeof(double));
+ memcpy(samples, func->samples, (nSamples * sizeof(double)).Int());
+ sBuf = (double *)gmallocn((SafeInt(1) << m).Int(), sizeof(double));
}
void SampledFunction::transform(double *in, double *out) {
@@ -570,8 +570,8 @@
}
k = obj1.arrayGetLength();
funcs = (Function **)gmallocn(k, sizeof(Function *));
- bounds = (double *)gmallocn(k + 1, sizeof(double));
- encode = (double *)gmallocn(2 * k, sizeof(double));
+ bounds = (double *)gmallocn(k + SafeInt(1), sizeof(double));
+ encode = (double *)gmallocn(SafeInt(2) * k, sizeof(double));
scale = (double *)gmallocn(k, sizeof(double));
for (i = 0; i < k; ++i) {
funcs[i] = NULL;
@@ -604,7 +604,7 @@
bounds[i] = obj2.getNum();
obj2.free();
}
- bounds[k] = domain[0][1];
+ bounds[k.Int()] = domain[0][1];
obj1.free();
//----- Encode
@@ -651,12 +651,12 @@
for (i = 0; i < k; ++i) {
funcs[i] = func->funcs[i]->copy();
}
- bounds = (double *)gmallocn(k + 1, sizeof(double));
- memcpy(bounds, func->bounds, (k + 1) * sizeof(double));
- encode = (double *)gmallocn(2 * k, sizeof(double));
- memcpy(encode, func->encode, 2 * k * sizeof(double));
+ bounds = (double *)gmallocn(k + SafeInt(1), sizeof(double));
+ memcpy(bounds, func->bounds, ((k + 1) * sizeof(double)).Int());
+ encode = (double *)gmallocn(SafeInt(2) * k, sizeof(double));
+ memcpy(encode, func->encode, (2 * k * sizeof(double)).Int());
scale = (double *)gmallocn(k, sizeof(double));
- memcpy(scale, func->scale, k * sizeof(double));
+ memcpy(scale, func->scale, (k * sizeof(double)).Int());
ok = gTrue;
}
@@ -1051,7 +1051,7 @@
PostScriptFunction::PostScriptFunction(PostScriptFunction *func) {
memcpy(this, func, sizeof(PostScriptFunction));
code = (PSObject *)gmallocn(codeSize, sizeof(PSObject));
- memcpy(code, func->code, codeSize * sizeof(PSObject));
+ memcpy(code, func->code, (codeSize * sizeof(PSObject)).Int());
codeString = func->codeString->copy();
}
--- xpdf-3.02/xpdf/Function.h
+++ xpdf-3.02/xpdf/Function.h
@@ -131,7 +131,7 @@
inputMul[funcMaxInputs];
int idxMul[funcMaxInputs]; // sample array index multipliers
double *samples; // the samples
- int nSamples; // size of the samples array
+ SafeInt nSamples; // size of the samples array
double *sBuf; // buffer for the transform function
GBool ok;
};
@@ -178,7 +178,7 @@
virtual void transform(double *in, double *out);
virtual GBool isOk() { return ok; }
- int getNumFuncs() { return k; }
+ int getNumFuncs() { return k.Int(); }
Function *getFunc(int i) { return funcs[i]; }
double *getBounds() { return bounds; }
double *getEncode() { return encode; }
@@ -188,7 +188,7 @@
StitchingFunction(StitchingFunction *func);
- int k;
+ SafeInt k;
Function **funcs;
double *bounds;
double *encode;
@@ -222,7 +222,7 @@
GString *codeString;
PSObject *code;
- int codeSize;
+ SafeInt codeSize;
GBool ok;
};
--- xpdf-3.02/xpdf/GfxFont.cc
+++ xpdf-3.02/xpdf/GfxFont.cc
@@ -368,7 +368,8 @@
Object obj1, obj2;
Stream *str;
int c;
- int size, i;
+ SafeInt size;
+ int i;
obj1.initRef(embFontID.num, embFontID.gen);
obj1.fetch(xref, &obj2);
@@ -382,12 +383,12 @@
str = obj2.getStream();
buf = NULL;
- i = size = 0;
+ size = i = 0;
str->reset();
while ((c = str->getChar()) != EOF) {
if (i == size) {
size += 4096;
- buf = (char *)grealloc(buf, size);
+ buf = (char *)grealloc(buf, size.Int());
}
buf[i++] = c;
}
@@ -1086,7 +1087,8 @@
CharCode c;
Unicode uBuf[8];
int c1, c2;
- int excepsSize, i, j, k, n;
+ int j, k, n;
+ SafeInt i, excepsSize;
ascent = 0.95;
descent = -0.35;
@@ -1247,10 +1249,10 @@
excepsSize = 0;
i = 0;
while (i + 1 < obj1.arrayGetLength()) {
- obj1.arrayGet(i, &obj2);
- obj1.arrayGet(i + 1, &obj3);
- if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) {
- if (obj1.arrayGet(i + 2, &obj4)->isNum()) {
+ obj1.arrayGet(i.Int(), &obj2);
+ obj1.arrayGet((i + 1).Int(), &obj3);
+ if (obj2.isInt() && obj3.isInt() && (i + 2).Int() < obj1.arrayGetLength()) {
+ if (obj1.arrayGet((i + 2).Int(), &obj4)->isNum()) {
if (widths.nExceps == excepsSize) {
excepsSize += 16;
widths.exceps = (GfxFontCIDWidthExcep *)
@@ -1268,7 +1270,7 @@
i += 3;
} else if (obj2.isInt() && obj3.isArray()) {
if (widths.nExceps + obj3.arrayGetLength() > excepsSize) {
- excepsSize = (widths.nExceps + obj3.arrayGetLength() + 15) & ~15;
+ excepsSize = (SafeInt(widths.nExceps) + SafeInt(obj3.arrayGetLength()) + 15).Int() & ~15;
widths.exceps = (GfxFontCIDWidthExcep *)
greallocn(widths.exceps,
excepsSize, sizeof(GfxFontCIDWidthExcep));
@@ -1318,12 +1320,12 @@
excepsSize = 0;
i = 0;
while (i + 1 < obj1.arrayGetLength()) {
- obj1.arrayGet(i, &obj2);
- obj1.arrayGet(i+ 1, &obj3);
- if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) {
- if (obj1.arrayGet(i + 2, &obj4)->isNum() &&
- obj1.arrayGet(i + 3, &obj5)->isNum() &&
- obj1.arrayGet(i + 4, &obj6)->isNum()) {
+ obj1.arrayGet(i.Int(), &obj2);
+ obj1.arrayGet((i+ 1).Int(), &obj3);
+ if (obj2.isInt() && obj3.isInt() && (i + 4).Int() < obj1.arrayGetLength()) {
+ if (obj1.arrayGet((i + 2).Int(), &obj4)->isNum() &&
+ obj1.arrayGet((i + 3).Int(), &obj5)->isNum() &&
+ obj1.arrayGet((i + 4).Int(), &obj6)->isNum()) {
if (widths.nExcepsV == excepsSize) {
excepsSize += 16;
widths.excepsV = (GfxFontCIDWidthExcepV *)
@@ -1511,7 +1513,7 @@
Unicode u[64];
const int ulen = sizeof(u) / sizeof(Unicode);
int code, i;
- int mapsize;
+ SafeInt mapsize;
int cidlen;
*mapsizep = 0;
@@ -1529,7 +1531,7 @@
cidlen = 0;
mapsize = 64;
- map = (Gushort *)gmalloc(mapsize * sizeof(Gushort));
+ map = (Gushort *)gmallocn(mapsize, sizeof(Gushort));
while (cidlen < ctu->getMapLen()) {
int n;
@@ -1540,7 +1542,7 @@
if (cidlen >= mapsize) {
while (cidlen >= mapsize)
mapsize *= 2;
- map = (Gushort *)grealloc(map, mapsize * sizeof(Gushort));
+ map = (Gushort *)greallocn(map, mapsize, sizeof(Gushort));
}
if (n == 1)
map[cidlen] = ff->mapCodeToGID(cmap, u[0]);
--- xpdf-3.02/xpdf/GfxState.cc
+++ xpdf-3.02/xpdf/GfxState.cc
@@ -925,7 +925,7 @@
int indexHighA) {
base = baseA;
indexHigh = indexHighA;
- lookup = (Guchar *)gmallocn((indexHigh + 1) * base->getNComps(),
+ lookup = (Guchar *)gmallocn((SafeInt(indexHigh) + SafeInt(1)) * SafeInt(base->getNComps()),
sizeof(Guchar));
}
@@ -2337,7 +2337,7 @@
vertices = (GfxGouraudVertex *)gmallocn(nVertices, sizeof(GfxGouraudVertex));
memcpy(vertices, shading->vertices, nVertices * sizeof(GfxGouraudVertex));
nTriangles = shading->nTriangles;
- triangles = (int (*)[3])gmallocn(nTriangles * 3, sizeof(int));
+ triangles = (int (*)[3])gmallocn(SafeInt(nTriangles) * SafeInt(3), sizeof(int));
memcpy(triangles, shading->triangles, nTriangles * 3 * sizeof(int));
nFuncs = shading->nFuncs;
for (i = 0; i < nFuncs; ++i) {
@@ -2368,7 +2368,8 @@
double cMul[gfxColorMaxComps];
GfxGouraudVertex *verticesA;
int (*trianglesA)[3];
- int nComps, nVerticesA, nTrianglesA, vertSize, triSize;
+ int nComps, nVerticesA, nTrianglesA;
+ SafeInt vertSize, triSize;
Guint x, y, flag;
Guint c[gfxColorMaxComps];
GfxShadingBitBuf *bitBuf;
@@ -2506,7 +2507,7 @@
if (nTrianglesA == triSize) {
triSize = (triSize == 0) ? 16 : 2 * triSize;
trianglesA = (int (*)[3])
- greallocn(trianglesA, triSize * 3, sizeof(int));
+ greallocn(trianglesA, SafeInt(triSize) * SafeInt(3), sizeof(int));
}
if (state == 2) {
trianglesA[nTrianglesA][0] = nVerticesA - 3;
@@ -2531,8 +2532,9 @@
delete bitBuf;
if (typeA == 5) {
nRows = nVerticesA / vertsPerRow;
- nTrianglesA = (nRows - 1) * 2 * (vertsPerRow - 1);
- trianglesA = (int (*)[3])gmallocn(nTrianglesA * 3, sizeof(int));
+ nTrianglesA = ((SafeInt(nRows) - SafeInt(1)) * SafeInt(2)
+ * (SafeInt(vertsPerRow) - SafeInt(1))).Int();
+ trianglesA = (int (*)[3])gmallocn(SafeInt(nTrianglesA) * SafeInt(3), sizeof(int));
k = 0;
for (i = 0; i < nRows - 1; ++i) {
for (j = 0; j < vertsPerRow - 1; ++j) {
@@ -2673,7 +2675,8 @@
double xMul, yMul;
double cMul[gfxColorMaxComps];
GfxPatch *patchesA, *p;
- int nComps, nPatchesA, patchesSize, nPts, nColors;
+ int nComps, nPatchesA, nPts, nColors;
+ SafeInt patchesSize;
Guint flag;
double x[16], y[16];
Guint xi, yi;
@@ -3253,7 +3256,7 @@
lookup2 = indexedCS->getLookup();
colorSpace2->getDefaultRanges(x, y, indexHigh);
for (k = 0; k < nComps2; ++k) {
- lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+ lookup[k] = (GfxColorComp *)gmallocn(SafeInt(maxPixel) + SafeInt(1),
sizeof(GfxColorComp));
for (i = 0; i <= maxPixel; ++i) {
j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5);
@@ -3272,7 +3275,7 @@
nComps2 = colorSpace2->getNComps();
sepFunc = sepCS->getFunc();
for (k = 0; k < nComps2; ++k) {
- lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+ lookup[k] = (GfxColorComp *)gmallocn(SafeInt(maxPixel) + SafeInt(1),
sizeof(GfxColorComp));
for (i = 0; i <= maxPixel; ++i) {
x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel;
@@ -3282,7 +3285,7 @@
}
} else {
for (k = 0; k < nComps; ++k) {
- lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+ lookup[k] = (GfxColorComp *)gmallocn(SafeInt(maxPixel) + SafeInt(1),
sizeof(GfxColorComp));
for (i = 0; i <= maxPixel; ++i) {
lookup[k][i] = dblToCol(decodeLow[k] +
@@ -3300,7 +3303,8 @@
}
GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) {
- int n, i, k;
+ int i, k;
+ SafeInt n;
colorSpace = colorMap->colorSpace->copy();
bits = colorMap->bits;
@@ -3310,23 +3314,23 @@
for (k = 0; k < gfxColorMaxComps; ++k) {
lookup[k] = NULL;
}
- n = 1 << bits;
+ n = SafeInt(1) << bits;
if (colorSpace->getMode() == csIndexed) {
colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase();
for (k = 0; k < nComps2; ++k) {
lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
- memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ memcpy(lookup[k], colorMap->lookup[k], n.Int() * sizeof(GfxColorComp));
}
} else if (colorSpace->getMode() == csSeparation) {
colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt();
for (k = 0; k < nComps2; ++k) {
lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
- memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ memcpy(lookup[k], colorMap->lookup[k], n.Int() * sizeof(GfxColorComp));
}
} else {
for (k = 0; k < nComps; ++k) {
lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
- memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+ memcpy(lookup[k], colorMap->lookup[k], n.Int() * sizeof(GfxColorComp));
}
}
for (i = 0; i < nComps; ++i) {
@@ -3506,7 +3510,7 @@
// Used for copy().
GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1,
- GfxSubpath **subpaths1, int n1, int size1) {
+ GfxSubpath **subpaths1, SafeInt n1, SafeInt size1) {
int i;
justMoved = justMoved1;
@@ -3532,11 +3536,11 @@
subpaths = (GfxSubpath **)
greallocn(subpaths, size, sizeof(GfxSubpath *));
}
- subpaths[n] = new GfxSubpath(firstX, firstY);
+ subpaths[n.Int()] = new GfxSubpath(firstX, firstY);
++n;
justMoved = gFalse;
}
- subpaths[n-1]->lineTo(x, y);
+ subpaths[n.Int()-1]->lineTo(x, y);
}
void GfxPath::curveTo(double x1, double y1, double x2, double y2,
@@ -3547,11 +3551,11 @@
subpaths = (GfxSubpath **)
greallocn(subpaths, size, sizeof(GfxSubpath *));
}
- subpaths[n] = new GfxSubpath(firstX, firstY);
+ subpaths[n.Int()] = new GfxSubpath(firstX, firstY);
++n;
justMoved = gFalse;
}
- subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3);
+ subpaths[n.Int()-1]->curveTo(x1, y1, x2, y2, x3, y3);
}
void GfxPath::close() {
@@ -3563,11 +3567,11 @@
subpaths = (GfxSubpath **)
greallocn(subpaths, size, sizeof(GfxSubpath *));
}
- subpaths[n] = new GfxSubpath(firstX, firstY);
+ subpaths[n.Int()] = new GfxSubpath(firstX, firstY);
++n;
justMoved = gFalse;
}
- subpaths[n-1]->close();
+ subpaths[n.Int()-1]->close();
}
void GfxPath::append(GfxPath *path) {
@@ -3579,7 +3583,7 @@
greallocn(subpaths, size, sizeof(GfxSubpath *));
}
for (i = 0; i < path->n; ++i) {
- subpaths[n++] = path->subpaths[i]->copy();
+ subpaths[(n++).Int()] = path->subpaths[i]->copy();
}
justMoved = gFalse;
}
--- xpdf-3.02/xpdf/GfxState.h
+++ xpdf-3.02/xpdf/GfxState.h
@@ -942,7 +942,7 @@
GBool *curve; // curve[i] => point i is a control point
// for a Bezier curve
int n; // number of points
- int size; // size of x/y arrays
+ SafeInt size; // size of x/y arrays
GBool closed; // set if path is closed
GfxSubpath(GfxSubpath *subpath);
@@ -968,12 +968,12 @@
GBool isPath() { return n > 0; }
// Get subpaths.
- int getNumSubpaths() { return n; }
+ int getNumSubpaths() { return n.Int(); }
GfxSubpath *getSubpath(int i) { return subpaths[i]; }
// Get last point on last subpath.
- double getLastX() { return subpaths[n-1]->getLastX(); }
- double getLastY() { return subpaths[n-1]->getLastY(); }
+ double getLastX() { return subpaths[n.Int()-1]->getLastX(); }
+ double getLastY() { return subpaths[n.Int()-1]->getLastY(); }
// Move the current point.
void moveTo(double x, double y);
@@ -999,11 +999,11 @@
GBool justMoved; // set if a new subpath was just started
double firstX, firstY; // first point in new subpath
GfxSubpath **subpaths; // subpaths
- int n; // number of subpaths
- int size; // size of subpaths array
+ SafeInt n; // number of subpaths
+ SafeInt size; // size of subpaths array
GfxPath(GBool justMoved1, double firstX1, double firstY1,
- GfxSubpath **subpaths1, int n1, int size1);
+ GfxSubpath **subpaths1, SafeInt n1, SafeInt size1);
};
//------------------------------------------------------------------------
--- xpdf-3.02/xpdf/ImageOutputDev.cc
+++ xpdf-3.02/xpdf/ImageOutputDev.cc
@@ -26,7 +26,7 @@
ImageOutputDev::ImageOutputDev(char *fileRootA, GBool dumpJPEGA) {
fileRoot = copyString(fileRootA);
- fileName = (char *)gmalloc(strlen(fileRoot) + 20);
+ fileName = (char *)gmalloc((SafeInt(strlen(fileRoot)) + SafeInt(20)).Int());
dumpJPEG = dumpJPEGA;
imgNum = 0;
ok = gTrue;
--- xpdf-3.02/xpdf/JArithmeticDecoder.cc
+++ xpdf-3.02/xpdf/JArithmeticDecoder.cc
@@ -7,6 +7,7 @@
//========================================================================
#include <aconf.h>
+#include <stdlib.h>
#ifdef USE_GCC_PRAGMAS
#pragma implementation
@@ -47,6 +48,10 @@
}
void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) {
+ if (cx >= contextSize) {
+ fprintf(stderr, "index out of bounds");
+ exit(1);
+ }
cxTab[cx] = (i << 1) + mps;
}
--- xpdf-3.02/xpdf/JBIG2Stream.cc
+++ xpdf-3.02/xpdf/JBIG2Stream.cc
@@ -684,7 +684,7 @@
{
w = wA;
h = hA;
- line = (wA + 7) >> 3;
+ line = (SafeInt(wA) + SafeInt(7) >> 3).Int();
if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) {
// force a call to gmalloc(-1), which will throw an exception
h = -1;
@@ -1522,7 +1522,7 @@
}
// get the input symbol bitmaps
- bitmaps = (JBIG2Bitmap **)gmallocn(numInputSyms + numNewSyms,
+ bitmaps = (JBIG2Bitmap **)gmallocn(SafeInt(numInputSyms) + SafeInt(numNewSyms),
sizeof(JBIG2Bitmap *));
for (i = 0; i < numInputSyms + numNewSyms; ++i) {
bitmaps[i] = NULL;
@@ -1845,7 +1845,8 @@
int sOffset;
Guint huffFlags, huffFS, huffDS, huffDT;
Guint huffRDW, huffRDH, huffRDX, huffRDY, huffRSize;
- Guint numInstances, numSyms, symCodeLen;
+ Guint numInstances, symCodeLen;
+ SafeInt numSyms;
int atx[2], aty[2];
Guint i, k, kk;
int j;
@@ -2048,7 +2049,7 @@
runLengthTab[35].prefixLen = 0;
runLengthTab[35].rangeLen = jbig2HuffmanEOT;
huffDecoder->buildTable(runLengthTab, 35);
- symCodeTab = (JBIG2HuffmanTable *)gmallocn(numSyms + 1,
+ symCodeTab = (JBIG2HuffmanTable *)gmallocn(numSyms + SafeInt(1),
sizeof(JBIG2HuffmanTable));
for (i = 0; i < numSyms; ++i) {
symCodeTab[i].val = i;
@@ -2070,9 +2071,9 @@
symCodeTab[i++].prefixLen = j;
}
}
- symCodeTab[numSyms].prefixLen = 0;
- symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT;
- huffDecoder->buildTable(symCodeTab, numSyms);
+ symCodeTab[numSyms.Int()].prefixLen = 0;
+ symCodeTab[numSyms.Int()].rangeLen = jbig2HuffmanEOT;
+ huffDecoder->buildTable(symCodeTab, numSyms.Int());
huffDecoder->reset();
// set up the arithmetic decoder
@@ -2086,7 +2087,7 @@
}
bitmap = readTextRegion(huff, refine, w, h, numInstances,
- logStrips, numSyms, symCodeTab, symCodeLen, syms,
+ logStrips, numSyms.Int(), symCodeTab, symCodeLen, syms,
defPixel, combOp, transposed, refCorner, sOffset,
huffFSTable, huffDSTable, huffDTTable,
huffRDWTable, huffRDHTable,
@@ -2638,6 +2639,7 @@
error(getPos(), "Bad width in JBIG2 generic bitmap");
// force a call to gmalloc(-1), which will throw an exception
w = -3;
+ gmallocn(w + 2, sizeof(int));
}
refLine = (int *)gmallocn(w + 2, sizeof(int));
codingLine = (int *)gmallocn(w + 2, sizeof(int));
@@ -3314,7 +3316,7 @@
val = lowVal;
while (val < highVal) {
if (i == huffTabSize) {
- huffTabSize *= 2;
+ huffTabSize = (SafeInt(huffTabSize) * 2).Int();
huffTab = (JBIG2HuffmanTable *)
greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
}
--- xpdf-3.02/xpdf/JPXStream.cc
+++ xpdf-3.02/xpdf/JPXStream.cc
@@ -652,7 +652,7 @@
}
palette.bpc = (Guint *)gmallocn(palette.nComps, sizeof(Guint));
palette.c =
- (int *)gmallocn(palette.nEntries * palette.nComps, sizeof(int));
+ (int *)gmallocn(SafeInt(palette.nEntries) * SafeInt(palette.nComps), sizeof(int));
for (i = 0; i < palette.nComps; ++i) {
if (!readUByte(&palette.bpc[i])) {
error(getPos(), "Unexpected EOF in JPX stream");
@@ -910,7 +910,7 @@
error(getPos(), "Bad tile count in JPX SIZ marker segment");
return gFalse;
}
- img.tiles = (JPXTile *)gmallocn(img.nXTiles * img.nYTiles,
+ img.tiles = (JPXTile *)gmallocn(SafeInt(img.nXTiles) * SafeInt(img.nYTiles),
sizeof(JPXTile));
for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
img.tiles[i].tileComps = (JPXTileComp *)gmallocn(img.nComps,
@@ -978,7 +978,7 @@
}
img.tiles[i].tileComps[comp].resLevels =
(JPXResLevel *)gmallocn(
- (img.tiles[i].tileComps[comp].nDecompLevels + 1),
+ (SafeInt(img.tiles[i].tileComps[comp].nDecompLevels) + SafeInt(1)),
sizeof(JPXResLevel));
for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL;
@@ -1055,7 +1055,7 @@
img.tiles[i].tileComps[comp].resLevels =
(JPXResLevel *)greallocn(
img.tiles[i].tileComps[comp].resLevels,
- (img.tiles[i].tileComps[comp].nDecompLevels + 1),
+ (SafeInt(img.tiles[i].tileComps[comp].nDecompLevels) + SafeInt(1)),
sizeof(JPXResLevel));
for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL;
@@ -1457,7 +1457,7 @@
img.tiles[tileIdx].tileComps[comp].resLevels =
(JPXResLevel *)greallocn(
img.tiles[tileIdx].tileComps[comp].resLevels,
- (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1),
+ (SafeInt(img.tiles[tileIdx].tileComps[comp].nDecompLevels) + SafeInt(1)),
sizeof(JPXResLevel));
for (r = 0;
r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels;
@@ -1512,7 +1512,7 @@
img.tiles[tileIdx].tileComps[comp].resLevels =
(JPXResLevel *)greallocn(
img.tiles[tileIdx].tileComps[comp].resLevels,
- (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1),
+ (SafeInt(img.tiles[tileIdx].tileComps[comp].nDecompLevels) + SafeInt(1)),
sizeof(JPXResLevel));
for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) {
img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL;
@@ -1775,15 +1775,15 @@
tileComp->y1 = jpxCeilDiv(tile->y1, tileComp->hSep);
tileComp->cbW = 1 << tileComp->codeBlockW;
tileComp->cbH = 1 << tileComp->codeBlockH;
- tileComp->data = (int *)gmallocn((tileComp->x1 - tileComp->x0) *
- (tileComp->y1 - tileComp->y0),
+ tileComp->data = (int *)gmallocn((SafeInt(tileComp->x1) - SafeInt(tileComp->x0)) *
+ (SafeInt(tileComp->y1) - SafeInt(tileComp->y0)),
sizeof(int));
if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) {
n = tileComp->x1 - tileComp->x0;
} else {
n = tileComp->y1 - tileComp->y0;
}
- tileComp->buf = (int *)gmallocn(n + 8, sizeof(int));
+ tileComp->buf = (int *)gmallocn(SafeInt(n) + SafeInt(8), sizeof(int));
for (r = 0; r <= tileComp->nDecompLevels; ++r) {
resLevel = &tileComp->resLevels[r];
k = r == 0 ? tileComp->nDecompLevels
@@ -1844,7 +1844,7 @@
for (level = subband->maxTTLevel; level >= 0; --level) {
nx = jpxCeilDivPow2(subband->nXCBs, level);
ny = jpxCeilDivPow2(subband->nYCBs, level);
- n += nx * ny;
+ n += (SafeInt(nx) * SafeInt(ny)).Int();
}
subband->inclusion =
(JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode));
@@ -1856,8 +1856,8 @@
subband->zeroBitPlane[k].finished = gFalse;
subband->zeroBitPlane[k].val = 0;
}
- subband->cbs = (JPXCodeBlock *)gmallocn(subband->nXCBs *
- subband->nYCBs,
+ subband->cbs = (JPXCodeBlock *)gmallocn(SafeInt(subband->nXCBs) *
+ SafeInt(subband->nYCBs),
sizeof(JPXCodeBlock));
sbx0 = jpxFloorDivPow2(subband->x0, tileComp->codeBlockW);
sby0 = jpxFloorDivPow2(subband->y0, tileComp->codeBlockH);
@@ -1885,8 +1885,8 @@
cb->nextPass = jpxPassCleanup;
cb->nZeroBitPlanes = 0;
cb->coeffs =
- (JPXCoeff *)gmallocn((1 << (tileComp->codeBlockW
- + tileComp->codeBlockH)),
+ (JPXCoeff *)gmallocn((SafeInt(1) << (SafeInt(tileComp->codeBlockW)
+ + SafeInt(tileComp->codeBlockH)).Int()),
sizeof(JPXCoeff));
for (cbi = 0;
cbi < (Guint)(1 << (tileComp->codeBlockW
--- xpdf-3.02/xpdf/Link.cc
+++ xpdf-3.02/xpdf/Link.cc
@@ -725,7 +725,7 @@
Links::Links(Object *annots, GString *baseURI) {
Link *link;
Object obj1, obj2;
- int size;
+ SafeInt size;
int i;
links = NULL;
--- xpdf-3.02/xpdf/NameToCharCode.cc
+++ xpdf-3.02/xpdf/NameToCharCode.cc
@@ -49,7 +49,8 @@
void NameToCharCode::add(char *name, CharCode c) {
NameToCharCodeEntry *oldTab;
- int h, i, oldSize;
+ int h, i;
+ SafeInt oldSize;
// expand the table if necessary
if (len >= size / 2) {
@@ -112,5 +113,5 @@
for (p = name; *p; ++p) {
h = 17 * h + (int)(*p & 0xff);
}
- return (int)(h % size);
+ return (int)(h % size.Int());
}
--- xpdf-3.02/xpdf/NameToCharCode.h
+++ xpdf-3.02/xpdf/NameToCharCode.h
@@ -35,7 +35,7 @@
int hash(char *name);
NameToCharCodeEntry *tab;
- int size;
+ SafeInt size;
int len;
};
--- xpdf-3.02/xpdf/PSOutputDev.cc
+++ xpdf-3.02/xpdf/PSOutputDev.cc
@@ -2253,11 +2253,11 @@
if (fontFileNameLen >= fontFileNameSize) {
fontFileNameSize += 64;
fontFileNames =
- (GString **)grealloc(fontFileNames,
- fontFileNameSize * sizeof(GString *));
+ (GString **)greallocn(fontFileNames,
+ fontFileNameSize, sizeof(GString *));
psFileNames =
- (GString **)grealloc(psFileNames,
- fontFileNameSize * sizeof(GString *));
+ (GString **)greallocn(psFileNames,
+ fontFileNameSize, sizeof(GString *));
}
}
fontFileNames[fontFileNameLen] = myFileName;
@@ -2274,7 +2274,7 @@
if ((ffTT = FoFiTrueType::load(fileName->getCString(), faceIndex))) {
int n = ((GfxCIDFont *)font)->getCIDToGIDLen();
if (n) {
- codeToGID = (Gushort *)gmalloc(n * sizeof(Gushort));
+ codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort));
memcpy(codeToGID, ((GfxCIDFont *)font)->getCIDToGID(), n * sizeof(Gushort));
} else {
codeToGID = ((GfxCIDFont *)font)->getCodeToGIDMap(ffTT, &n);
@@ -4412,7 +4412,7 @@
width, -height, height);
// allocate a line buffer
- lineBuf = (Guchar *)gmalloc(4 * width);
+ lineBuf = (Guchar *)gmallocn(4, width);
// set up to process the data stream
imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
@@ -4465,7 +4465,8 @@
ImageStream *imgStr;
Guchar *line;
PSOutImgClipRect *rects0, *rects1, *rectsTmp, *rectsOut;
- int rects0Len, rects1Len, rectsSize, rectsOutLen, rectsOutSize;
+ int rects0Len, rects1Len, rectsOutLen;
+ SafeInt rectsOutSize, rectsSize;
GBool emitRect, addRect, extendRect;
GString *s;
int n, numComps;
--- xpdf-3.02/xpdf/PSOutputDev.h
+++ xpdf-3.02/xpdf/PSOutputDev.h
@@ -328,10 +328,10 @@
Ref *fontIDs; // list of object IDs of all used fonts
int fontIDLen; // number of entries in fontIDs array
- int fontIDSize; // size of fontIDs array
+ SafeInt fontIDSize; // size of fontIDs array
Ref *fontFileIDs; // list of object IDs of all embedded fonts
int fontFileIDLen; // number of entries in fontFileIDs array
- int fontFileIDSize; // size of fontFileIDs array
+ SafeInt fontFileIDSize; // size of fontFileIDs array
GString **fontFileNames; // list of names of all embedded external fonts
GString **psFileNames; // list of names of all embedded external ps names
int fontFileNameLen; // number of entries in fontFileNames array
@@ -340,16 +340,16 @@
// font name
PSFont8Info *font8Info; // info for 8-bit fonts
int font8InfoLen; // number of entries in font8Info array
- int font8InfoSize; // size of font8Info array
+ SafeInt font8InfoSize; // size of font8Info array
PSFont16Enc *font16Enc; // encodings for substitute 16-bit fonts
int font16EncLen; // number of entries in font16Enc array
- int font16EncSize; // size of font16Enc array
+ SafeInt font16EncSize; // size of font16Enc array
Ref *imgIDs; // list of image IDs for in-memory images
int imgIDLen; // number of entries in imgIDs array
- int imgIDSize; // size of imgIDs array
+ SafeInt imgIDSize; // size of imgIDs array
Ref *formIDs; // list of IDs for predefined forms
int formIDLen; // number of entries in formIDs array
- int formIDSize; // size of formIDs array
+ SafeInt formIDSize; // size of formIDs array
GList *xobjStack; // stack of XObject dicts currently being
// processed
int numSaves; // current number of gsaves
--- xpdf-3.02/xpdf/SplashOutputDev.cc
+++ xpdf-3.02/xpdf/SplashOutputDev.cc
@@ -488,8 +488,8 @@
int glyphW, glyphH; // size of glyph bitmaps, in pixels
GBool validBBox; // false if the bbox was [0 0 0 0]
int glyphSize; // size of glyph bitmaps, in bytes
- int cacheSets; // number of sets in cache
- int cacheAssoc; // cache associativity (glyphs per set)
+ SafeInt cacheSets; // number of sets in cache
+ SafeInt cacheAssoc; // cache associativity (glyphs per set)
Guchar *cacheData; // glyph pixmap cache
T3FontCacheTag *cacheTags; // cache tags, i.e., char codes
};
@@ -529,7 +529,7 @@
cacheTags = (T3FontCacheTag *)gmallocn(cacheSets * cacheAssoc,
sizeof(T3FontCacheTag));
for (i = 0; i < cacheSets * cacheAssoc; ++i) {
- cacheTags[i].mru = i & (cacheAssoc - 1);
+ cacheTags[i].mru = i & (cacheAssoc.Int() - 1);
}
}
@@ -1537,7 +1537,7 @@
t3Font = t3FontCache[0];
// is the glyph in the cache?
- i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc;
+ i = (code & (t3Font->cacheSets.Int() - 1)) * t3Font->cacheAssoc.Int();
for (j = 0; j < t3Font->cacheAssoc; ++j) {
if ((t3Font->cacheTags[i+j].mru & 0x8000) &&
t3Font->cacheTags[i+j].code == code) {
@@ -1644,7 +1644,7 @@
}
// allocate a cache entry
- i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc;
+ i = (t3GlyphStack->code & (t3Font->cacheSets.Int() - 1)) * t3Font->cacheAssoc.Int();
for (j = 0; j < t3Font->cacheAssoc; ++j) {
if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) {
t3Font->cacheTags[i+j].mru = 0x8000;
@@ -2008,7 +2008,7 @@
// build a lookup table here
imgData.lookup = NULL;
if (colorMap->getNumPixelComps() == 1) {
- n = 1 << colorMap->getBits();
+ n = (SafeInt(1) << colorMap->getBits()).Int();
switch (colorMode) {
case splashModeMono1:
case splashModeMono8:
@@ -2021,7 +2021,7 @@
break;
case splashModeRGB8:
case splashModeBGR8:
- imgData.lookup = (SplashColorPtr)gmalloc(3 * n);
+ imgData.lookup = (SplashColorPtr)gmallocn(3, n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
colorMap->getRGB(&pix, &rgb);
@@ -2032,7 +2032,7 @@
break;
#if SPLASH_CMYK
case splashModeCMYK8:
- imgData.lookup = (SplashColorPtr)gmalloc(4 * n);
+ imgData.lookup = (SplashColorPtr)gmallocn(4, n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
colorMap->getCMYK(&pix, &cmyk);
@@ -2252,7 +2252,7 @@
// build a lookup table here
imgData.lookup = NULL;
if (colorMap->getNumPixelComps() == 1) {
- n = 1 << colorMap->getBits();
+ n = (SafeInt(1) << colorMap->getBits()).Int();
switch (colorMode) {
case splashModeMono1:
case splashModeMono8:
@@ -2265,7 +2265,7 @@
break;
case splashModeRGB8:
case splashModeBGR8:
- imgData.lookup = (SplashColorPtr)gmalloc(3 * n);
+ imgData.lookup = (SplashColorPtr)gmallocn(3, n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
colorMap->getRGB(&pix, &rgb);
@@ -2276,7 +2276,7 @@
break;
#if SPLASH_CMYK
case splashModeCMYK8:
- imgData.lookup = (SplashColorPtr)gmalloc(4 * n);
+ imgData.lookup = (SplashColorPtr)gmallocn(4, n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
colorMap->getCMYK(&pix, &cmyk);
@@ -2347,7 +2347,7 @@
imgMaskData.width = maskWidth;
imgMaskData.height = maskHeight;
imgMaskData.y = 0;
- n = 1 << maskColorMap->getBits();
+ n = (SafeInt(1) << maskColorMap->getBits()).Int();
imgMaskData.lookup = (SplashColorPtr)gmalloc(n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
@@ -2384,7 +2384,7 @@
// build a lookup table here
imgData.lookup = NULL;
if (colorMap->getNumPixelComps() == 1) {
- n = 1 << colorMap->getBits();
+ n = (SafeInt(1) << colorMap->getBits()).Int();
switch (colorMode) {
case splashModeMono1:
case splashModeMono8:
@@ -2397,7 +2397,7 @@
break;
case splashModeRGB8:
case splashModeBGR8:
- imgData.lookup = (SplashColorPtr)gmalloc(3 * n);
+ imgData.lookup = (SplashColorPtr)gmallocn(3, n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
colorMap->getRGB(&pix, &rgb);
@@ -2408,7 +2408,7 @@
break;
#if SPLASH_CMYK
case splashModeCMYK8:
- imgData.lookup = (SplashColorPtr)gmalloc(4 * n);
+ imgData.lookup = (SplashColorPtr)gmallocn(4, n);
for (i = 0; i < n; ++i) {
pix = (Guchar)i;
colorMap->getCMYK(&pix, &cmyk);
--- xpdf-3.02/xpdf/Stream.cc
+++ xpdf-3.02/xpdf/Stream.cc
@@ -319,7 +319,7 @@
nVals = width * nComps;
if (nBits == 1) {
- imgLineSize = (nVals + 7) & ~7;
+ imgLineSize = (SafeInt(nVals) + SafeInt(7)).Int() & ~7;
} else {
imgLineSize = nVals;
}
@@ -492,7 +492,7 @@
break;
case 13: // PNG average
predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) +
- (Guchar)c;
+ (Guchar)c;
break;
case 14: // PNG Paeth
left = predLine[i - pixBytes];
@@ -1253,8 +1253,8 @@
// ---> max codingLine size = columns + 1
// refLine has one extra guard entry at the end
// ---> max refLine size = columns + 2
- codingLine = (int *)gmallocn(columns + 1, sizeof(int));
- refLine = (int *)gmallocn(columns + 2, sizeof(int));
+ codingLine = (int *)gmallocn(SafeInt(columns) + SafeInt(1), sizeof(int));
+ refLine = (int *)gmallocn(SafeInt(columns) + SafeInt(2), sizeof(int));
eof = gFalse;
row = 0;
@@ -1969,7 +1969,7 @@
restartInterval = 0;
if (!readHeader()) {
- y = height;
+ y = height.Int();
return;
}
@@ -2014,12 +2014,12 @@
if (bufWidth <= 0 || bufHeight <= 0 ||
bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) {
error(getPos(), "Invalid image size in DCT stream");
- y = height;
+ y = height.Int();
return;
}
for (i = 0; i < numComps; ++i) {
frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int));
- memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int));
+ memset(frameBuf[i], 0, (bufWidth * bufHeight * sizeof(int)).Int());
}
// read the image data
@@ -2051,7 +2051,7 @@
comp = 0;
x = 0;
y = 0;
- dy = mcuHeight;
+ dy = mcuHeight.Int();
restartMarker = 0xd0;
restart();
@@ -2079,7 +2079,7 @@
return EOF;
}
if (progressive || !interleaved) {
- c = frameBuf[comp][y * bufWidth + x];
+ c = frameBuf[comp][y * bufWidth.Int() + x];
if (++comp == numComps) {
comp = 0;
if (++x == width) {
@@ -2090,7 +2090,7 @@
} else {
if (dy >= mcuHeight) {
if (!readMCURow()) {
- y = height;
+ y = height.Int();
return EOF;
}
comp = 0;
@@ -2118,11 +2118,11 @@
return EOF;
}
if (progressive || !interleaved) {
- return frameBuf[comp][y * bufWidth + x];
+ return frameBuf[comp][y * bufWidth.Int() + x];
} else {
if (dy >= mcuHeight) {
if (!readMCURow()) {
- y = height;
+ y = height.Int();
return EOF;
}
comp = 0;
@@ -2154,7 +2154,7 @@
int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;
int c;
- for (x1 = 0; x1 < width; x1 += mcuWidth) {
+ for (x1 = 0; x1 < width; x1 += mcuWidth.Int()) {
// deal with restart marker
if (restartInterval > 0 && restartCtr == 0) {
@@ -2172,8 +2172,8 @@
for (cc = 0; cc < numComps; ++cc) {
h = compInfo[cc].hSample;
v = compInfo[cc].vSample;
- horiz = mcuWidth / h;
- vert = mcuHeight / v;
+ horiz = mcuWidth.Int() / h;
+ vert = mcuHeight.Int() / v;
hSub = horiz / 8;
vSub = vert / 8;
for (y2 = 0; y2 < mcuHeight; y2 += vert) {
@@ -2279,11 +2279,11 @@
break;
}
}
- dx1 = mcuWidth / compInfo[cc].hSample;
- dy1 = mcuHeight / compInfo[cc].vSample;
+ dx1 = mcuWidth.Int() / compInfo[cc].hSample;
+ dy1 = mcuHeight.Int() / compInfo[cc].vSample;
} else {
- dx1 = mcuWidth;
- dy1 = mcuHeight;
+ dx1 = mcuWidth.Int();
+ dy1 = mcuHeight.Int();
}
for (y1 = 0; y1 < height; y1 += dy1) {
@@ -2310,14 +2310,14 @@
h = compInfo[cc].hSample;
v = compInfo[cc].vSample;
- horiz = mcuWidth / h;
- vert = mcuHeight / v;
+ horiz = mcuWidth.Int() / h;
+ vert = mcuHeight.Int() / v;
vSub = vert / 8;
for (y2 = 0; y2 < dy1; y2 += vert) {
for (x2 = 0; x2 < dx1; x2 += horiz) {
// pull out the current values
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+ p1 = &frameBuf[cc][(y1+y2) * bufWidth.Int() + (x1+x2)];
for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
data[i] = p1[0];
data[i+1] = p1[1];
@@ -2327,7 +2327,7 @@
data[i+5] = p1[5];
data[i+6] = p1[6];
data[i+7] = p1[7];
- p1 += bufWidth * vSub;
+ p1 += bufWidth.Int() * vSub;
}
// read one data unit
@@ -2349,7 +2349,7 @@
}
// add the data unit into frameBuf
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+ p1 = &frameBuf[cc][(y1+y2) * bufWidth.Int() + (x1+x2)];
for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
p1[0] = data[i];
p1[1] = data[i+1];
@@ -2359,7 +2359,7 @@
p1[5] = data[i+5];
p1[6] = data[i+6];
p1[7] = data[i+7];
- p1 += bufWidth * vSub;
+ p1 += bufWidth.Int() * vSub;
}
}
}
@@ -2556,21 +2556,21 @@
int h, v, horiz, vert, hSub, vSub;
int *p0, *p1, *p2;
- for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) {
- for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) {
+ for (y1 = 0; y1 < bufHeight; y1 += mcuHeight.Int()) {
+ for (x1 = 0; x1 < bufWidth; x1 += mcuWidth.Int()) {
for (cc = 0; cc < numComps; ++cc) {
quantTable = quantTables[compInfo[cc].quantTable];
h = compInfo[cc].hSample;
v = compInfo[cc].vSample;
- horiz = mcuWidth / h;
- vert = mcuHeight / v;
+ horiz = mcuWidth.Int() / h;
+ vert = mcuHeight.Int() / v;
hSub = horiz / 8;
vSub = vert / 8;
for (y2 = 0; y2 < mcuHeight; y2 += vert) {
for (x2 = 0; x2 < mcuWidth; x2 += horiz) {
// pull out the coded data unit
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+ p1 = &frameBuf[cc][(y1+y2) * bufWidth.Int() + (x1+x2)];
for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
dataIn[i] = p1[0];
dataIn[i+1] = p1[1];
@@ -2580,7 +2580,7 @@
dataIn[i+5] = p1[5];
dataIn[i+6] = p1[6];
dataIn[i+7] = p1[7];
- p1 += bufWidth * vSub;
+ p1 += bufWidth.Int() * vSub;
}
// transform
@@ -2588,7 +2588,7 @@
// store back into frameBuf, doing replication for
// subsampled components
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+ p1 = &frameBuf[cc][(y1+y2) * bufWidth.Int() + (x1+x2)];
if (hSub == 1 && vSub == 1) {
for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
p1[0] = dataOut[i] & 0xff;
@@ -2599,10 +2599,10 @@
p1[5] = dataOut[i+5] & 0xff;
p1[6] = dataOut[i+6] & 0xff;
p1[7] = dataOut[i+7] & 0xff;
- p1 += bufWidth;
+ p1 += bufWidth.Int();
}
} else if (hSub == 2 && vSub == 2) {
- p2 = p1 + bufWidth;
+ p2 = p1 + bufWidth.Int();
for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {
p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff;
p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff;
@@ -2612,8 +2612,8 @@
p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff;
p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff;
p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff;
- p1 += bufWidth * 2;
- p2 += bufWidth * 2;
+ p1 += bufWidth.Int() * 2;
+ p2 += bufWidth.Int() * 2;
}
} else {
i = 0;
@@ -2624,11 +2624,11 @@
for (x5 = 0; x5 < hSub; ++x5) {
p2[x5] = dataOut[i] & 0xff;
}
- p2 += bufWidth;
+ p2 += bufWidth.Int();
}
++i;
}
- p1 += bufWidth * vSub;
+ p1 += bufWidth.Int() * vSub;
}
}
}
@@ -2640,9 +2640,9 @@
// convert YCbCr to RGB
if (numComps == 3) {
for (y2 = 0; y2 < mcuHeight; ++y2) {
- p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];
- p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];
- p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];
+ p0 = &frameBuf[0][(y1+y2) * bufWidth.Int() + x1];
+ p1 = &frameBuf[1][(y1+y2) * bufWidth.Int() + x1];
+ p2 = &frameBuf[2][(y1+y2) * bufWidth.Int() + x1];
for (x2 = 0; x2 < mcuWidth; ++x2) {
pY = *p0;
pCb = *p1 - 128;
@@ -2659,9 +2659,9 @@
// convert YCbCrK to CMYK (K is passed through unchanged)
} else if (numComps == 4) {
for (y2 = 0; y2 < mcuHeight; ++y2) {
- p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];
- p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];
- p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];
+ p0 = &frameBuf[0][(y1+y2) * bufWidth.Int() + x1];
+ p1 = &frameBuf[1][(y1+y2) * bufWidth.Int() + x1];
+ p2 = &frameBuf[2][(y1+y2) * bufWidth.Int() + x1];
for (x2 = 0; x2 < mcuWidth; ++x2) {
pY = *p0;
pCb = *p1 - 128;
@@ -4321,7 +4321,7 @@
}
// allocate the table
- tabSize = 1 << tab->maxLen;
+ tabSize = (SafeInt(1) << tab->maxLen).Int();
tab->codes = (FlateCode *)gmallocn(tabSize, sizeof(FlateCode));
// clear the table
--- xpdf-3.02/xpdf/Stream.h
+++ xpdf-3.02/xpdf/Stream.h
@@ -592,9 +592,9 @@
GBool progressive; // set if in progressive mode
GBool interleaved; // set if in interleaved mode
- int width, height; // image size
- int mcuWidth, mcuHeight; // size of min coding unit, in data units
- int bufWidth, bufHeight; // frameBuf size
+ SafeInt width, height; // image size
+ SafeInt mcuWidth, mcuHeight; // size of min coding unit, in data units
+ SafeInt bufWidth, bufHeight; // frameBuf size
DCTCompInfo compInfo[4]; // info for each component
DCTScanInfo scanInfo; // info for the current scan
int numComps; // number of components in image
--- xpdf-3.02/xpdf/TextOutputDev.cc
+++ xpdf-3.02/xpdf/TextOutputDev.cc
@@ -263,7 +263,7 @@
}
text = NULL;
edge = NULL;
- len = size = 0;
+ size = len = 0;
spaceAfter = gFalse;
next = NULL;
@@ -346,9 +346,9 @@
yMax = word->yMax;
}
if (len + word->len > size) {
- size = len + word->len;
+ size = SafeInt(len) + SafeInt(word->len);
text = (Unicode *)greallocn(text, size, sizeof(Unicode));
- edge = (double *)greallocn(edge, size + 1, sizeof(double));
+ edge = (double *)greallocn(edge, size + SafeInt(1), sizeof(double));
}
for (i = 0; i < word->len; ++i) {
text[len + i] = word->text[i];
@@ -481,11 +481,11 @@
}
TextPool::~TextPool() {
- int baseIdx;
+ SafeInt baseIdx;
TextWord *word, *word2;
for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
- for (word = pool[baseIdx - minBaseIdx]; word; word = word2) {
+ for (word = pool[(baseIdx - minBaseIdx).Int()]; word; word = word2) {
word2 = word->next;
delete word;
}
@@ -498,17 +498,17 @@
baseIdx = (int)(base / textPoolStep);
if (baseIdx < minBaseIdx) {
- return minBaseIdx;
+ return minBaseIdx.Int();
}
if (baseIdx > maxBaseIdx) {
- return maxBaseIdx;
+ return maxBaseIdx.Int();
}
return baseIdx;
}
void TextPool::addWord(TextWord *word) {
TextWord **newPool;
- int wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx;
+ SafeInt wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx;
TextWord *w0, *w1;
// expand the array if needed
@@ -516,29 +516,29 @@
if (minBaseIdx > maxBaseIdx) {
minBaseIdx = wordBaseIdx - 128;
maxBaseIdx = wordBaseIdx + 128;
- pool = (TextWord **)gmallocn(maxBaseIdx - minBaseIdx + 1,
+ pool = (TextWord **)gmallocn(maxBaseIdx - minBaseIdx + SafeInt(1),
sizeof(TextWord *));
for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
- pool[baseIdx - minBaseIdx] = NULL;
+ pool[(baseIdx - minBaseIdx).Int()] = NULL;
}
} else if (wordBaseIdx < minBaseIdx) {
newMinBaseIdx = wordBaseIdx - 128;
- newPool = (TextWord **)gmallocn(maxBaseIdx - newMinBaseIdx + 1,
+ newPool = (TextWord **)gmallocn(maxBaseIdx - newMinBaseIdx + SafeInt(1),
sizeof(TextWord *));
for (baseIdx = newMinBaseIdx; baseIdx < minBaseIdx; ++baseIdx) {
- newPool[baseIdx - newMinBaseIdx] = NULL;
+ newPool[(baseIdx - newMinBaseIdx).Int()] = NULL;
}
- memcpy(&newPool[minBaseIdx - newMinBaseIdx], pool,
- (maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *));
+ memcpy(&newPool[(minBaseIdx - newMinBaseIdx).Int()], pool,
+ ((maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *)).Int());
gfree(pool);
pool = newPool;
minBaseIdx = newMinBaseIdx;
} else if (wordBaseIdx > maxBaseIdx) {
newMaxBaseIdx = wordBaseIdx + 128;
- pool = (TextWord **)greallocn(pool, newMaxBaseIdx - minBaseIdx + 1,
+ pool = (TextWord **)greallocn(pool, newMaxBaseIdx - minBaseIdx + SafeInt(1),
sizeof(TextWord *));
for (baseIdx = maxBaseIdx + 1; baseIdx <= newMaxBaseIdx; ++baseIdx) {
- pool[baseIdx - minBaseIdx] = NULL;
+ pool[(baseIdx - minBaseIdx).Int()] = NULL;
}
maxBaseIdx = newMaxBaseIdx;
}
@@ -550,17 +550,17 @@
w1 = cursor->next;
} else {
w0 = NULL;
- w1 = pool[wordBaseIdx - minBaseIdx];
+ w1 = pool[(wordBaseIdx - minBaseIdx).Int()];
}
for (; w1 && word->primaryCmp(w1) > 0; w0 = w1, w1 = w1->next) ;
word->next = w1;
if (w0) {
w0->next = word;
} else {
- pool[wordBaseIdx - minBaseIdx] = word;
+ pool[(wordBaseIdx - minBaseIdx).Int()] = word;
}
cursor = word;
- cursorBaseIdx = wordBaseIdx;
+ cursorBaseIdx = wordBaseIdx.Int();
}
//------------------------------------------------------------------------
@@ -763,7 +763,7 @@
}
}
text = (Unicode *)gmallocn(len, sizeof(Unicode));
- edge = (double *)gmallocn(len + 1, sizeof(double));
+ edge = (double *)gmallocn(len + SafeInt(1), sizeof(double));
i = 0;
for (word1 = words; word1; word1 = word1->next) {
for (j = 0; j < word1->len; ++j) {
@@ -779,7 +779,7 @@
}
// compute convertedLen and set up the col array
- col = (int *)gmallocn(len + 1, sizeof(int));
+ col = (int *)gmallocn(len + SafeInt(1), sizeof(int));
convertedLen = 0;
for (i = 0; i < len; ++i) {
col[i] = convertedLen;
@@ -789,11 +789,11 @@
convertedLen += uMap->mapUnicode(text[i], buf, sizeof(buf));
}
}
- col[len] = convertedLen;
+ col[len.Int()] = convertedLen;
// check for hyphen at end of line
//~ need to check for other chars used as hyphens
- hyphenated = text[len - 1] == (Unicode)'-';
+ hyphenated = text[(len - 1).Int()] == (Unicode)'-';
}
//------------------------------------------------------------------------
@@ -1163,7 +1163,7 @@
int i, j, k;
// discard duplicated text (fake boldface, drop shadows)
- for (idx0 = pool->minBaseIdx; idx0 <= pool->maxBaseIdx; ++idx0) {
+ for (idx0 = pool->minBaseIdx.Int(); idx0 <= pool->maxBaseIdx.Int(); ++idx0) {
word0 = pool->getPool(idx0);
while (word0) {
priDelta = dupMaxPriDelta * word0->fontSize;
@@ -1227,7 +1227,7 @@
// build the lines
curLine = NULL;
- poolMinBaseIdx = pool->minBaseIdx;
+ poolMinBaseIdx = pool->minBaseIdx.Int();
charCount = 0;
nLines = 0;
while (1) {
@@ -1329,7 +1329,7 @@
line->next = line1;
curLine = line;
line->coalesce(uMap);
- charCount += line->len;
+ charCount += line->len.Int();
++nLines;
}
@@ -1338,7 +1338,7 @@
for (line = lines, i = 0; line; line = line->next, ++i) {
lineArray[i] = line;
}
- qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY);
+ qsort(lineArray, nLines.Int(), sizeof(TextLine *), &TextLine::cmpXY);
// column assignment
nColumns = 0;
@@ -1348,7 +1348,7 @@
for (j = 0; j < i; ++j) {
line1 = lineArray[j];
if (line1->primaryDelta(line0) >= 0) {
- col2 = line1->col[line1->len] + 1;
+ col2 = line1->col[line1->len.Int()] + 1;
} else {
k = 0; // make gcc happy
switch (rot) {
@@ -1386,8 +1386,8 @@
for (k = 0; k <= line0->len; ++k) {
line0->col[k] += col1;
}
- if (line0->col[line0->len] > nColumns) {
- nColumns = line0->col[line0->len];
+ if (line0->col[line0->len.Int()] > nColumns) {
+ nColumns = line0->col[line0->len.Int()];
}
}
gfree(lineArray);
@@ -1660,7 +1660,8 @@
TextLine *line;
TextWord *word;
TextWord **wordArray;
- int nWords, i;
+ SafeInt nWords;
+ int i;
words = new GList();
@@ -2125,7 +2126,8 @@
GBool found;
int count[4];
int lrCount;
- int firstBlkIdx, nBlocksLeft;
+ int firstBlkIdx;
+ SafeInt nBlocksLeft;
int col1, col2;
int i, j, n;
@@ -2311,7 +2313,7 @@
// build blocks for each rotation value
for (rot = 0; rot < 4; ++rot) {
pool = pools[rot];
- poolMinBaseIdx = pool->minBaseIdx;
+ poolMinBaseIdx = pool->minBaseIdx.Int();
count[rot] = 0;
// add blocks until no more words are left
@@ -2679,7 +2681,7 @@
for (blk = blkList, i = 0; blk; blk = blk->next, ++i) {
blocks[i] = blk;
}
- qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot);
+ qsort(blocks, nBlocks.Int(), sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot);
// column assignment
for (i = 0; i < nBlocks; ++i) {
@@ -2771,7 +2773,7 @@
//----- reading order sort
// sort blocks into yx order (in preparation for reading order sort)
- qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpYXPrimaryRot);
+ qsort(blocks, nBlocks.Int(), sizeof(TextBlock *), &TextBlock::cmpYXPrimaryRot);
// compute space on left and right sides of each block
for (i = 0; i < nBlocks; ++i) {
@@ -2811,7 +2813,7 @@
//~ this needs to be adjusted for writing mode (vertical text)
//~ this also needs to account for right-to-left column ordering
blkArray = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *));
- memcpy(blkArray, blocks, nBlocks * sizeof(TextBlock *));
+ memcpy(blkArray, blocks, nBlocks.Int() * sizeof(TextBlock *));
flows = lastFlow = NULL;
firstBlkIdx = 0;
nBlocksLeft = nBlocks;
@@ -2983,7 +2985,7 @@
xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy
xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy
- for (i = backward ? nBlocks - 1 : 0;
+ for (i = backward ? (nBlocks - 1).Int() : 0;
backward ? i >= 0 : i < nBlocks;
i += backward ? -1 : 1) {
blk = blocks[i];
@@ -3013,7 +3015,7 @@
}
// convert the line to uppercase
- m = line->len;
+ m = line->len.Int();
if (!caseSensitive) {
if (m > txtSize) {
txt = (Unicode *)greallocn(txt, m, sizeof(Unicode));
@@ -3134,7 +3136,8 @@
TextBlock *blk;
TextLine *line;
TextLineFrag *frags;
- int nFrags, fragsSize;
+ int nFrags;
+ SafeInt fragsSize;
TextLineFrag *frag;
char space[8], eol[16];
int spaceLen, eolLen;
@@ -3197,7 +3200,7 @@
}
++j;
}
- j = line->len - 1;
+ j = (line->len - 1).Int();
while (j >= 0) {
if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) {
idx1 = j;
@@ -3218,7 +3221,7 @@
}
++j;
}
- j = line->len - 1;
+ j = (line->len - 1).Int();
while (j >= 0) {
if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) {
idx1 = j;
@@ -3239,7 +3242,7 @@
}
++j;
}
- j = line->len - 1;
+ j = (line->len - 1).Int();
while (j >= 0) {
if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) {
idx1 = j;
@@ -3260,7 +3263,7 @@
}
++j;
}
- j = line->len - 1;
+ j = (line->len - 1).Int();
while (j >= 0) {
if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) {
idx1 = j;
@@ -3449,7 +3452,8 @@
TextLine *line;
TextLineFrag *frags;
TextWord *word;
- int nFrags, fragsSize;
+ int nFrags;
+ SafeInt fragsSize;
TextLineFrag *frag;
char space[8], eol[16], eop[8];
int spaceLen, eolLen, eopLen;
@@ -3515,7 +3519,7 @@
frags = (TextLineFrag *)greallocn(frags,
fragsSize, sizeof(TextLineFrag));
}
- frags[nFrags].init(line, 0, line->len);
+ frags[nFrags].init(line, 0, line->len.Int());
frags[nFrags].computeCoords(gTrue);
++nFrags;
}
@@ -3592,7 +3596,7 @@
for (flow = flows; flow; flow = flow->next) {
for (blk = flow->blocks; blk; blk = blk->next) {
for (line = blk->lines; line; line = line->next) {
- n = line->len;
+ n = line->len.Int();
if (line->hyphenated && (line->next || blk->next)) {
--n;
}
--- xpdf-3.02/xpdf/TextOutputDev.h
+++ xpdf-3.02/xpdf/TextOutputDev.h
@@ -145,7 +145,7 @@
double *edge; // "near" edge x or y coord of each char
// (plus one extra entry for the last char)
int len; // length of text and edge arrays
- int size; // size of text and edge arrays
+ SafeInt size; // size of text and edge arrays
int charPos; // character position (within content stream)
int charLen; // number of content stream characters in
// this word
@@ -182,8 +182,8 @@
TextPool();
~TextPool();
- TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; }
- void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; }
+ TextWord *getPool(int baseIdx) { return pool[(baseIdx - minBaseIdx).Int()]; }
+ void setPool(int baseIdx, TextWord *p) { pool[(baseIdx - minBaseIdx).Int()] = p; }
int getBaseIdx(double base);
@@ -191,8 +191,8 @@
private:
- int minBaseIdx; // min baseline bucket index
- int maxBaseIdx; // max baseline bucket index
+ SafeInt minBaseIdx; // min baseline bucket index
+ SafeInt maxBaseIdx; // max baseline bucket index
TextWord **pool; // array of linked lists, one for each
// baseline value (multiple of 4 pts)
TextWord *cursor; // pointer to last-accessed word
@@ -256,7 +256,7 @@
double *edge; // "near" edge x or y coord of each char
// (plus one extra entry for the last char)
int *col; // starting column number of each Unicode char
- int len; // number of Unicode chars
+ SafeInt len; // number of Unicode chars
int convertedLen; // total number of converted characters
GBool hyphenated; // set if last char is a hyphen
TextLine *next; // next line in block
@@ -315,7 +315,7 @@
// are built)
TextLine *lines; // linked list of lines
TextLine *curLine; // most recently added line
- int nLines; // number of lines
+ SafeInt nLines; // number of lines
int charCount; // number of characters in the block
int col; // starting column
int nColumns; // number of columns in the block
@@ -506,7 +506,7 @@
TextPool *pools[4]; // a "pool" of TextWords for each rotation
TextFlow *flows; // linked list of flows
TextBlock **blocks; // array of blocks, in yx order
- int nBlocks; // number of blocks
+ SafeInt nBlocks; // number of blocks
int primaryRot; // primary rotation
GBool primaryLR; // primary direction (true means L-to-R,
// false means R-to-L)
--- xpdf-3.02/xpdf/UnicodeMap.cc
+++ xpdf-3.02/xpdf/UnicodeMap.cc
@@ -39,7 +39,7 @@
UnicodeMap *map;
UnicodeMapRange *range;
UnicodeMapExt *eMap;
- int size, eMapsSize;
+ SafeInt size, eMapsSize;
char buf[256];
int line, nBytes, i, x;
char *tok1, *tok2, *tok3;
--- xpdf-3.02/xpdf/XPDFCore.cc
+++ xpdf-3.02/xpdf/XPDFCore.cc
@@ -763,7 +763,8 @@
int nVisuals;
XColor xcolor;
XColor *xcolors;
- int r, g, b, n, m;
+ int r, g, b, n;
+ SafeInt m;
GBool ok;
// for some reason, querying XmNvisual doesn't work (even if done
@@ -808,13 +809,13 @@
// set colors in private colormap
if (installCmap) {
for (rgbCubeSize = xMaxRGBCube; rgbCubeSize >= 2; --rgbCubeSize) {
- m = rgbCubeSize * rgbCubeSize * rgbCubeSize;
- if (XAllocColorCells(display, colormap, False, NULL, 0, colors, m)) {
+ m = SafeInt(rgbCubeSize) * SafeInt(rgbCubeSize) * SafeInt(rgbCubeSize);
+ if (XAllocColorCells(display, colormap, False, NULL, 0, colors, m.Int())) {
break;
}
}
if (rgbCubeSize >= 2) {
- m = rgbCubeSize * rgbCubeSize * rgbCubeSize;
+ m = SafeInt(rgbCubeSize) * SafeInt(rgbCubeSize) * SafeInt(rgbCubeSize);
xcolors = (XColor *)gmallocn(m, sizeof(XColor));
n = 0;
for (r = 0; r < rgbCubeSize; ++r) {
@@ -829,7 +830,7 @@
}
}
}
- XStoreColors(display, colormap, xcolors, m);
+ XStoreColors(display, colormap, xcolors, m.Int());
gfree(xcolors);
} else {
rgbCubeSize = 1;
@@ -1174,7 +1175,7 @@
w = tile->xMax - tile->xMin;
h = tile->yMax - tile->yMin;
image = XCreateImage(display, visual, depth, ZPixmap, 0, NULL, w, h, 8, 0);
- image->data = (char *)gmalloc(h * image->bytes_per_line);
+ image->data = (char *)gmalloc((SafeInt(h) * SafeInt(image->bytes_per_line)).Int());
tile->image = image;
} else {
image = (XImage *)tile->image;
@@ -1247,9 +1248,9 @@
}
} else {
// do Floyd-Steinberg dithering on the whole bitmap
- errDownR = (int *)gmallocn(width + 2, sizeof(int));
- errDownG = (int *)gmallocn(width + 2, sizeof(int));
- errDownB = (int *)gmallocn(width + 2, sizeof(int));
+ errDownR = (int *)gmallocn(SafeInt(width) + SafeInt(2), sizeof(int));
+ errDownG = (int *)gmallocn(SafeInt(width) + SafeInt(2), sizeof(int));
+ errDownB = (int *)gmallocn(SafeInt(width) + SafeInt(2), sizeof(int));
errRightR = errRightG = errRightB = 0;
errDownRightR = errDownRightG = errDownRightB = 0;
memset(errDownR, 0, (width + 2) * sizeof(int));
--- xpdf-3.02/xpdf/XPDFViewer.cc
+++ xpdf-3.02/xpdf/XPDFViewer.cc
@@ -262,7 +262,7 @@
ok = gFalse;
#ifndef DISABLE_OUTLINE
outlineLabels = NULL;
- outlineLabelsLength = outlineLabelsSize = 0;
+ outlineLabelsSize = outlineLabelsLength = 0;
outlinePaneWidth = 175;
#endif
viewerTitle = NULL;
@@ -323,7 +323,7 @@
ok = gFalse;
#ifndef DISABLE_OUTLINE
outlineLabels = NULL;
- outlineLabelsLength = outlineLabelsSize = 0;
+ outlineLabelsSize = outlineLabelsLength = 0;
outlinePaneWidth = 175;
#endif
viewerTitle = NULL;
@@ -2756,7 +2756,7 @@
}
gfree(outlineLabels);
outlineLabels = NULL;
- outlineLabelsLength = outlineLabelsSize = 0;
+ outlineLabelsSize = outlineLabelsLength = 0;
}
if (core->getDoc()) {
--- xpdf-3.02/xpdf/XPDFViewer.h
+++ xpdf-3.02/xpdf/XPDFViewer.h
@@ -305,7 +305,7 @@
Widget outlineTree;
Widget *outlineLabels;
int outlineLabelsLength;
- int outlineLabelsSize;
+ SafeInt outlineLabelsSize;
Dimension outlinePaneWidth;
#endif
XPDFCore *core;
--- xpdf-3.02/xpdf/XRef.cc
+++ xpdf-3.02/xpdf/XRef.cc
@@ -350,7 +350,8 @@
GBool more;
Object obj, obj2;
Guint pos2;
- int first, n, newSize, i;
+ int first, n, i;
+ SafeInt newSize;
while (1) {
parser->getObj(&obj);
@@ -372,7 +373,7 @@
goto err1;
}
if (first + n > size) {
- for (newSize = size ? 2 * size : 1024;
+ for (newSize = size ? SafeInt(2) * SafeInt(size) : 1024;
first + n > newSize && newSize > 0;
newSize <<= 1) ;
if (newSize < 0) {
@@ -383,7 +384,7 @@
entries[i].offset = 0xffffffff;
entries[i].type = xrefEntryFree;
}
- size = newSize;
+ size = newSize.Int();
}
for (i = first; i < first + n; ++i) {
if (!parser->getObj(&obj)->isInt()) {
@@ -471,7 +472,7 @@
int w[3];
GBool more;
Object obj, obj2, idx;
- int newSize, first, n, i;
+ int first, n, i, newSize;
dict = xrefStr->getDict();
@@ -562,13 +563,14 @@
GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) {
Guint offset;
- int type, gen, c, newSize, i, j;
+ int type, gen, c, i, j;
+ SafeInt newSize;
if (first + n < 0) {
return gFalse;
}
if (first + n > size) {
- for (newSize = size ? 2 * size : 1024;
+ for (newSize = size ? SafeInt(2) * SafeInt(size) : 1024;
first + n > newSize && newSize > 0;
newSize <<= 1) ;
if (newSize < 0) {
@@ -579,7 +581,7 @@
entries[i].offset = 0xffffffff;
entries[i].type = xrefEntryFree;
}
- size = newSize;
+ size = newSize.Int();
}
for (i = first; i < first + n; ++i) {
if (w[0] == 0) {
@@ -637,8 +639,8 @@
char buf[256];
Guint pos;
int num, gen;
- int newSize;
- int streamEndsSize;
+ SafeInt newSize;
+ SafeInt streamEndsSize;
char *p;
int i;
GBool gotRoot;
@@ -649,7 +651,7 @@
error(-1, "PDF file is damaged - attempting to reconstruct xref table...");
gotRoot = gFalse;
- streamEndsLen = streamEndsSize = 0;
+ streamEndsSize = streamEndsLen = 0;
str->reset();
while (1) {
@@ -708,7 +710,7 @@
} while (*p && isspace(*p));
if (!strncmp(p, "obj", 3)) {
if (num >= size) {
- newSize = (num + 1 + 255) & ~255;
+ newSize = (SafeInt(num) + 1 + 255).Int() & ~255;
if (newSize < 0) {
error(-1, "Bad object number");
return gFalse;
@@ -719,7 +721,7 @@
entries[i].offset = 0xffffffff;
entries[i].type = xrefEntryFree;
}
- size = newSize;
+ size = newSize.Int();
}
if (entries[num].type == xrefEntryFree ||
gen >= entries[num].gen) {
--- xpdf-3.02/xpdf/pdffonts.cc
+++ xpdf-3.02/xpdf/pdffonts.cc
@@ -77,7 +77,7 @@
static Ref *fonts;
static int fontsLen;
-static int fontsSize;
+static SafeInt fontsSize;
int main(int argc, char *argv[]) {
PDFDoc *doc;
@@ -143,7 +143,7 @@
printf("name type emb sub uni object ID\n");
printf("------------------------------------ ----------------- --- --- --- ---------\n");
fonts = NULL;
- fontsLen = fontsSize = 0;
+ fontsSize = fontsLen = 0;
for (pg = firstPage; pg <= lastPage; ++pg) {
page = doc->getCatalog()->getPage(pg);
if ((resDict = page->getResourceDict())) {