poppler/PDFDoc.cc | 6 +++--- poppler/Page.cc | 4 +++- poppler/XRef.cc | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-)
New commits: commit d07818d63677ccd2ea68b580ee45085597681a36 Author: Albert Astals Cid <[email protected]> Date: Thu Mar 23 19:22:21 2023 +0100 Page::removeAnnot: Reorder code to fix memory leak We were removing the annot object from the xref, then calling removeReferencedObjects that in some cases calls setModifiedObject on the xref with that same annot object, which is wrong, we can't modify an object that isn't there anymore diff --git a/poppler/Page.cc b/poppler/Page.cc index c256d391..83a4d88e 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -490,7 +490,6 @@ void Page::removeAnnot(Annot *annot) } annots->removeAnnot(annot); // Gracefully fails on popup windows annArray.arrayRemove(idx); - xref->removeIndirectObject(annotRef); if (annotsObj.isRef()) { xref->setModifiedObject(&annArray, annotsObj.getRef()); @@ -499,6 +498,9 @@ void Page::removeAnnot(Annot *annot) } } annot->removeReferencedObjects(); // Note: Might recurse in removeAnnot again + if (annArray.isArray()) { + xref->removeIndirectObject(annotRef); + } annot->setPage(0, false); } commit 96a953dbde5339798ca583a5ced2e6f0384351e7 Author: Albert Astals Cid <[email protected]> Date: Thu Mar 23 19:21:16 2023 +0100 XRef: Add a warning if calling setModifiedObject on empty ref diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 601ecd6a..08706623 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -1425,6 +1425,9 @@ void XRef::setModifiedObject(const Object *o, Ref r) return; } XRefEntry *e = getEntry(r.num); + if (unlikely(e->type == xrefEntryFree)) { + error(errInternal, -1, "XRef::setModifiedObject on ref: {0:d}, {1:d} that is marked as free. This will cause a memory leak\n", r.num, r.gen); + } e->obj = o->copy(); e->setFlag(XRefEntry::Updated, true); setModified(); commit ea5e64f139094ec93b2261d51a61c8a8b9b57e44 Author: Albert Astals Cid <[email protected]> Date: Fri Mar 17 00:14:56 2023 +0100 PDFDoc::sign: Fix memory issue when signing fails Issue #1372 diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index a81d5908..f1b9bfcb 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -2218,14 +2218,14 @@ bool PDFDoc::sign(const std::string &saveFilename, const std::string &certNickna form->ensureFontsForAllCharacters(&signatureText, pdfFontName); form->ensureFontsForAllCharacters(&signatureTextLeft, pdfFontName); - std::unique_ptr<::FormFieldSignature> field = std::make_unique<::FormFieldSignature>(this, Object(annotObj.getDict()), ref, nullptr, nullptr); + std::unique_ptr<::FormFieldSignature> field = std::make_unique<::FormFieldSignature>(this, std::move(annotObj), ref, nullptr, nullptr); field->setCustomAppearanceContent(signatureText); field->setCustomAppearanceLeftContent(signatureTextLeft); field->setCustomAppearanceLeftFontSize(leftFontSize); field->setImageResource(imageResourceRef); Object refObj(ref); - AnnotWidget *signatureAnnot = new AnnotWidget(this, &annotObj, &refObj, field.get()); + AnnotWidget *signatureAnnot = new AnnotWidget(this, field->getObj(), &refObj, field.get()); signatureAnnot->setFlags(signatureAnnot->getFlags() | Annot::flagPrint | Annot::flagLocked | Annot::flagNoRotate); Dict dummy(getXRef()); auto appearCharacs = std::make_unique<AnnotAppearanceCharacs>(&dummy); @@ -2251,7 +2251,7 @@ bool PDFDoc::sign(const std::string &saveFilename, const std::string &certNickna // Now remove the signature stuff in case the user wants to continue editing stuff // So the document object is clean - const Object &vRefObj = annotObj.dictLookupNF("V"); + const Object &vRefObj = field->getObj()->dictLookupNF("V"); if (vRefObj.isRef()) { getXRef()->removeIndirectObject(vRefObj.getRef()); }
