[poppler] poppler/XRef.cc
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Oct 12 21:04:12 UTC 2018
poppler/XRef.cc | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
New commits:
commit 5f817cb2067a226bc7bc271a42e66bbbf2811d98
Author: Tobias Deiminger <haxtibal at posteo.de>
Date: Mon Oct 1 21:39:06 2018 +0200
Skip XRef reconstruction for new-style XRef streams
XRef::constructXRef was invented to support old style XRef tables.
Sadly it won't work for XRef streams. If applied anyway, it corrupts our
existing XRef::entries array. Better skip reconstruction for the XRef-stream-case
in XRef::readXRefUntil (just like XRef::fetch already does).
Fixes #139.
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index 3c124d8c..70fc2a22 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -809,6 +809,9 @@ GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) {
}
// Attempt to construct an xref table for a damaged file.
+// Warning: Reconstruction of files where last XRef section is a stream
+// or where some objects are defined inside an object stream is not yet supported.
+// Existing data in XRef::entries may get corrupted if applied anyway.
GBool XRef::constructXRef(GBool *wasReconstructed, GBool needCatalogDict) {
Parser *parser;
Object obj;
@@ -1518,7 +1521,7 @@ void XRef::readXRefUntil(int untilEntryNum, std::vector<int> *xrefStreamObjsNum)
}
if (followed) {
error(errSyntaxError, -1, "Circular XRef");
- if (!(ok = constructXRef(nullptr))) {
+ if (!xRefStream && !(ok = constructXRef(nullptr))) {
errCode = errDamaged;
}
break;
@@ -1534,8 +1537,7 @@ void XRef::readXRefUntil(int untilEntryNum, std::vector<int> *xrefStreamObjsNum)
// if there was a problem with the xref table, or we haven't found the entry
// we were looking for, try to reconstruct the xref
if (!ok || (!prevXRefOffset && untilEntryNum != -1 && entries[untilEntryNum].type == xrefEntryNone)) {
- GBool wasReconstructed = false;
- if (!(ok = constructXRef(&wasReconstructed))) {
+ if (!xRefStream && !(ok = constructXRef(nullptr))) {
errCode = errDamaged;
break;
}
@@ -1569,7 +1571,7 @@ XRefEntry *XRef::getEntry(int i, GBool complainIfMissing)
if (entries[i].type == xrefEntryNone) {
if (complainIfMissing) {
- error(errSyntaxError, -1, "Invalid XRef entry");
+ error(errSyntaxError, -1, "Invalid XRef entry {0:d}", i);
}
entries[i].type = xrefEntryFree;
}
More information about the poppler
mailing list