[poppler] Branch 'xpdf303merge' - 5 commits - fofi/FoFiIdentifier.cc fofi/FoFiTrueType.cc
Carlos Garcia Campos
carlosgc at kemper.freedesktop.org
Wed Aug 31 08:08:30 PDT 2011
fofi/FoFiIdentifier.cc | 2 +-
fofi/FoFiTrueType.cc | 22 ++++++++++++++++++----
2 files changed, 19 insertions(+), 5 deletions(-)
New commits:
commit 4d4318e258fb68704b1a51a14fa89134606e2aa7
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Wed Aug 31 17:07:25 2011 +0200
xpdf303: Different growing strategy for vmtxTab in FoFiTrueType
diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index 958f35c..7114b78 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -1702,7 +1702,7 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
length = sizeof(vheaTab);
checksum = computeTableChecksum(vheaTab, length);
} else if (needVerticalMetrics && i == t42VmtxTable) {
- length = 4 + (nGlyphs - 1) * 4;
+ length = 4 + (nGlyphs - 1) * 2;
vmtxTab = (Guchar *)gmalloc(length);
vmtxTab[0] = advance / 256;
vmtxTab[1] = advance % 256;
commit c8c7fcef9bc8f802be2d376c9d2099971f159317
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Wed Aug 31 17:05:16 2011 +0200
xpdf303: Fix memory leak in FoFiTrueType
diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index 79e3b68..958f35c 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -1820,7 +1820,6 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
dumpString(vheaTab, length, outputFunc, outputStream);
} else if (needVerticalMetrics && i == t42VmtxTable) {
dumpString(vmtxTab, length, outputFunc, outputStream);
- gfree(vmtxTab);
}
}
}
@@ -1831,6 +1830,9 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
gfree(locaData);
gfree(locaTable);
+ if (vmtxTab) {
+ gfree(vmtxTab);
+ }
}
void FoFiTrueType::dumpString(Guchar *s, int length,
commit 655b1a97db5449c009e5b63fc7c12233e6fae450
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Wed Aug 31 16:54:05 2011 +0200
xpdf303: Check for an invalid loca format field in the head table in FoFiTrueType
diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index fecbd34..79e3b68 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -1575,6 +1575,13 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
memcpy(headData, file + pos, 54);
headData[8] = headData[9] = headData[10] = headData[11] = (Guchar)0;
+ // check for a bogus loca format field in the 'head' table
+ // (I've encountered fonts with loca format set to 0x0100 instead of 0x0001)
+ if (locaFmt != 0 && locaFmt != 1) {
+ headData[50] = 0;
+ headData[51] = 1;
+ }
+
// read the original 'loca' table, pad entries out to 4 bytes, and
// sort it into proper order -- some (non-compliant) fonts have
// out-of-order loca tables; in order to correctly handle the case
commit 9710ab96f1cf26394cc473952a3331d60c149451
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Wed Aug 31 16:49:54 2011 +0200
Fix the build
diff --git a/fofi/FoFiIdentifier.cc b/fofi/FoFiIdentifier.cc
index 0864a23..d8ee7e0 100644
--- a/fofi/FoFiIdentifier.cc
+++ b/fofi/FoFiIdentifier.cc
@@ -13,7 +13,7 @@
#include <stdio.h>
#include <string.h>
#include <limits.h>
-#include "gtypes.h"
+#include "goo/gtypes.h"
#include "FoFiIdentifier.h"
//------------------------------------------------------------------------
commit 36b733a3165fd26aa8c25ba57faa5d2277aa31ec
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Tue Aug 30 16:31:52 2011 +0200
xpdf303: Handle bogus loca table entries in FoFiTrueType
where the offset is past the end of the glyf table. This part was
missing in previous commit.
diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index 4cede12..fecbd34 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -1539,7 +1539,7 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
GBool ok;
Guint checksum;
int nNewTables;
- int length, pos, glyfPos, i, j, k;
+ int glyfTableLen, length, pos, glyfPos, i, j, k;
Guchar vheaTab[36] = {
0, 1, 0, 0, // table version number
0, 0, // ascent
@@ -1579,12 +1579,14 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
// sort it into proper order -- some (non-compliant) fonts have
// out-of-order loca tables; in order to correctly handle the case
// where (compliant) fonts have empty entries in the middle of the
- // table, cmpTrueTypeLocaPos uses offset as its primary sort key,
+ // table, cmpTrueTypeLocaOffset 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));
i = seekTable("loca");
pos = tables[i].offset;
+ i = seekTable("glyf");
+ glyfTableLen = tables[i].len;
ok = gTrue;
for (i = 0; i <= nGlyphs; ++i) {
locaTable[i].idx = i;
@@ -1593,6 +1595,9 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
} else {
locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
}
+ if (locaTable[i].origOffset > glyfTableLen) {
+ locaTable[i].origOffset = glyfTableLen;
+ }
}
std::sort(locaTable, locaTable + nGlyphs + 1,
cmpTrueTypeLocaOffsetFunctor());
More information about the poppler
mailing list