poppler/XRef.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) New commits: commit 407293bfb9108c9d9e2611a294b389ed9c593900 Author: Albert Astals Cid <aa...@kde.org> Date: Wed Dec 16 10:21:31 2020 +0100
Fix potential data loss if we try to fetch a non existing Ref after modifying the document diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 2cfe2136..66d3f04a 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -1208,6 +1208,20 @@ Object XRef::fetch(int num, int gen, int recursion, Goffset *endPos) err: if (!xRefStream && !xrefReconstructed) { + // Check if there has been any updated object, if there has been we can't reconstruct because that would mean losing the changes + bool xrefHasChanges = false; + for (int i = 0; !xrefHasChanges && i < size; i++) { + if (entries[i].getFlag(XRefEntry::Updated)) { + xrefHasChanges = true; + } + } + if (xrefHasChanges) { + error(errInternal, -1, "xref num {0:d} not found but needed, document has changes, reconstruct aborted\n", num); + // pretend we constructed the xref, otherwise we will do this check again and again + xrefReconstructed = true; + return Object(objNull); + } + error(errInternal, -1, "xref num {0:d} not found but needed, try to reconstruct\n", num); rootNum = -1; constructXRef(&xrefReconstructed); _______________________________________________ poppler mailing list poppler@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/poppler