[poppler] Branch 'xpdf303merge' - 6 commits - poppler/PDFDoc.cc poppler/PDFDoc.h poppler/XRef.cc poppler/XRef.h
Albert Astals Cid
aacid at kemper.freedesktop.org
Wed Nov 16 14:47:48 PST 2011
poppler/PDFDoc.cc | 54 ++++++++++++++++++++++++++++++++++++++++++------------
poppler/PDFDoc.h | 6 ++++++
poppler/XRef.cc | 9 ++++++++-
poppler/XRef.h | 1 +
4 files changed, 57 insertions(+), 13 deletions(-)
New commits:
commit ec2a1c3fca92a28c56911729927838f7aacf1078
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Nov 16 23:13:52 2011 +0100
xpdf303: Use the correct sizeof() for the greallocn
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index bcbcbc1..e1115c0 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -877,7 +877,7 @@ GBool XRef::constructXRef(GBool *wasReconstructed) {
return gFalse;
}
streamEnds = (Guint *)greallocn(streamEnds,
- streamEndsSize, sizeof(int));
+ streamEndsSize, sizeof(Guint));
}
streamEnds[streamEndsLen++] = pos;
}
commit 544440b9d19ce99f3a7fcacdea70999b1efc217f
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Nov 16 23:09:23 2011 +0100
xpdf303: Add XRef::getPermFlags
diff --git a/poppler/XRef.h b/poppler/XRef.h
index 0fa49ef..ecb1706 100644
--- a/poppler/XRef.h
+++ b/poppler/XRef.h
@@ -96,6 +96,7 @@ public:
GBool okToFillForm(GBool ignoreOwnerPW = gFalse);
GBool okToAccessibility(GBool ignoreOwnerPW = gFalse);
GBool okToAssemble(GBool ignoreOwnerPW = gFalse);
+ int getPermFlags() { return permFlags; }
// Get catalog object.
Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); }
commit b2e43e531edcecaeacf02a627c98cf7ef57f3e3c
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Nov 16 23:04:04 2011 +0100
xpdf303: make strToUnsigned "safer"
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index ea87b0a..ec0f9be 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -1392,13 +1392,16 @@ PDFDoc *PDFDoc::ErrorPDFDoc(int errorCode, GooString *fileNameA)
}
Guint PDFDoc::strToUnsigned(char *s) {
- Guint x;
+ Guint x, d;
char *p;
- int i;
x = 0;
- for (p = s, i = 0; *p && isdigit(*p) && i < 10; ++p, ++i) {
- x = 10 * x + (*p - '0');
+ for (p = s; *p && isdigit(*p & 0xff); ++p) {
+ d = *p - '0';
+ if (x > (UINT_MAX - d) / 10) {
+ break;
+ }
+ x = 10 * x + d;
}
return x;
}
commit bd1513742182ed4c80d21401dd30180981879f24
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Nov 16 22:59:12 2011 +0100
xpdf303: Check xrefEntryCompressed entries to be of correct type and in bounds
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index d9fc031..bcbcbc1 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -1053,6 +1053,11 @@ Object *XRef::fetch(int num, int gen, Object *obj, std::set<int> *fetchOriginato
goto err;
}
#endif
+ if (e->offset >= (Guint)size ||
+ entries[e->offset].type != xrefEntryUncompressed) {
+ error(errSyntaxError, -1, "Invalid object stream");
+ goto err;
+ }
ObjectStream *objStr = NULL;
ObjectStreamKey key(e->offset);
commit 3bf3e82d1f3eb19a454239d8c7641fc68ff4e462
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Nov 16 22:54:17 2011 +0100
xpdf303: Adobe apparently ignores the generation number on compressed objects
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index 901c4bc..d9fc031 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -1048,9 +1048,11 @@ Object *XRef::fetch(int num, int gen, Object *obj, std::set<int> *fetchOriginato
case xrefEntryCompressed:
{
+#if 0 // Adobe apparently ignores the generation number on compressed objects
if (gen != 0) {
goto err;
}
+#endif
ObjectStream *objStr = NULL;
ObjectStreamKey key(e->offset);
commit 73e6f19c4e76762eb5131b168e3b24167ba126cb
Author: Albert Astals Cid <aacid at kde.org>
Date: Wed Nov 16 22:29:11 2011 +0100
xpdf303: Add PDFDoc::fileNameU to windows builds
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index ca5f432..ea87b0a 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -119,11 +119,22 @@ PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword,
GooString *userPassword, void *guiDataA) {
Object obj;
int size = 0;
+#ifdef _WIN32
+ int n, i;
+#endif
init();
fileName = fileNameA;
guiData = guiDataA;
+#ifdef _WIN32
+ n = fileName->getLength();
+ fileNameU = (wchar_t *)gmallocn(n + 1, sizeof(wchar_t));
+ for (i = 0; i < n; ++i) {
+ fileNameU[i] = (wchar_t)(fileName->getChar(i) & 0xff);
+ }
+ fileNameU[n] = L'\0';
+#endif
struct stat buf;
if (stat(fileName->getCString(), &buf) == 0) {
@@ -157,7 +168,6 @@ PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword,
PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword,
GooString *userPassword, void *guiDataA) {
OSVERSIONINFO version;
- wchar_t fileName2[MAX_PATH + 1];
Object obj;
int i;
@@ -165,17 +175,15 @@ PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword,
guiData = guiDataA;
- //~ file name should be stored in Unicode (?)
+ // save both Unicode and 8-bit copies of the file name
fileName = new GooString();
+ fileNameU = (wchar_t *)gmallocn(fileNameLen + 1, sizeof(wchar_t));
for (i = 0; i < fileNameLen; ++i) {
fileName->append((char)fileNameA[i]);
+ fileNameU[i] = fileNameA[i];
}
+ fileNameU[fileNameLen] = L'\0';
- // zero-terminate the file name string
- for (i = 0; i < fileNameLen && i < MAX_PATH; ++i) {
- fileName2[i] = fileNameA[i];
- }
- fileName2[i] = 0;
// try to open file
// NB: _wfopen is only available in NT
@@ -187,7 +195,7 @@ PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword,
if (_wstat(fileName2, &buf) == 0) {
size = buf.st_size;
}
- file = _wfopen(fileName2, L"rb");
+ file = _wfopen(fileNameU, L"rb");
} else {
if (_stat(fileName->getCString(), &buf) == 0) {
size = buf.st_size;
@@ -210,13 +218,27 @@ PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword,
PDFDoc::PDFDoc(BaseStream *strA, GooString *ownerPassword,
GooString *userPassword, void *guiDataA) {
+#ifdef _WIN32
+ int n, i;
+#endif
init();
guiData = guiDataA;
if (strA->getFileName()) {
fileName = strA->getFileName()->copy();
+#ifdef _WIN32
+ n = fileName->getLength();
+ fileNameU = (wchar_t *)gmallocn(n + 1, sizeof(wchar_t));
+ for (i = 0; i < n; ++i) {
+ fileNameU[i] = (wchar_t)(fileName->getChar(i) & 0xff);
+ }
+ fileNameU[n] = L'\0';
+#endif
} else {
fileName = NULL;
+#ifdef _WIN32
+ fileNameU = NULL;
+#endif
}
str = strA;
ok = setup(ownerPassword, userPassword);
@@ -314,6 +336,11 @@ PDFDoc::~PDFDoc() {
if (fileName) {
delete fileName;
}
+#ifdef _WIN32
+ if (fileNameU) {
+ gfree(fileNameU);
+ }
+#endif
}
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index 92cee78..ccb1b22 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -93,6 +93,9 @@ public:
// Get file name.
GooString *getFileName() { return fileName; }
+#ifdef _WIN32
+ wchar_t *getFileNameU() { return fileNameU; }
+#endif
// Get the linearization table.
Linearization *getLinearization();
@@ -281,6 +284,9 @@ private:
Guint strToUnsigned(char *s);
GooString *fileName;
+#ifdef _WIN32
+ wchar_t *fileNameU;
+#endif
FILE *file;
BaseStream *str;
void *guiData;
More information about the poppler
mailing list