summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Astals Cid <aacid@kde.org>2014-11-03 19:20:23 +0100
committerAlbert Astals Cid <aacid@kde.org>2014-11-03 19:20:23 +0100
commit2fd0cd652cfc03c9af35a59192729e4ed26e8146 (patch)
treeeccb310ff40b28e17c31ad43255c547c5182b800
parentd6ea8acbb348fdb43601a963ba5407e933565003 (diff)
Fix memory leaks when running pdfseparate
Bug #84768
-rw-r--r--poppler/PDFDoc.cc102
-rw-r--r--poppler/PDFDoc.h2
-rw-r--r--utils/pdfseparate.cc8
-rw-r--r--utils/pdfunite.cc4
4 files changed, 50 insertions, 66 deletions
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index 8fd5e184..e88b8f61 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -637,7 +637,7 @@ int PDFDoc::savePageAs(GooString *name, int pageNo)
replacePageDict(pageNo,
getCatalog()->getPage(pageNo)->getRotate(),
getCatalog()->getPage(pageNo)->getMediaBox(),
- cropBox, NULL);
+ cropBox);
Ref *refPage = getCatalog()->getPageRef(pageNo);
Object page;
getXRef()->fetch(refPage->num, refPage->gen, &page);
@@ -649,8 +649,6 @@ int PDFDoc::savePageAs(GooString *name, int pageNo)
outStr = new FileOutStream(f,0);
yRef = new XRef(getXRef()->getTrailerDict());
- Object encrypt;
- getXRef()->getTrailerDict()->dictLookup("Encrypt", &encrypt);
if (secHdlr != NULL && !secHdlr->isUnencrypted()) {
yRef->setEncryption(secHdlr->getPermissionFlags(),
@@ -777,6 +775,7 @@ int PDFDoc::savePageAs(GooString *name, int pageNo)
fclose(f);
delete yRef;
delete countRef;
+ delete outStr;
return errNone;
}
@@ -1505,78 +1504,59 @@ void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffse
void PDFDoc::replacePageDict(int pageNo, int rotate,
PDFRectangle *mediaBox,
- PDFRectangle *cropBox, Object *pageCTM)
+ PDFRectangle *cropBox)
{
Ref *refPage = getCatalog()->getPageRef(pageNo);
Object page;
getXRef()->fetch(refPage->num, refPage->gen, &page);
Dict *pageDict = page.getDict();
+ pageDict->remove("MediaBoxssdf");
pageDict->remove("MediaBox");
pageDict->remove("CropBox");
pageDict->remove("ArtBox");
pageDict->remove("BleedBox");
pageDict->remove("TrimBox");
pageDict->remove("Rotate");
- Object *mediaBoxObj = new Object();
- mediaBoxObj->initArray(getXRef());
- Object *murx = new Object();
- murx->initReal(mediaBox->x1);
- Object *mury = new Object();
- mury->initReal(mediaBox->y1);
- Object *mllx = new Object();
- mllx->initReal(mediaBox->x2);
- Object *mlly = new Object();
- mlly->initReal(mediaBox->y2);
- mediaBoxObj->arrayAdd(murx);
- mediaBoxObj->arrayAdd(mury);
- mediaBoxObj->arrayAdd(mllx);
- mediaBoxObj->arrayAdd(mlly);
- pageDict->add(copyString("MediaBox"), mediaBoxObj);
+ Object mediaBoxObj;
+ mediaBoxObj.initArray(getXRef());
+ Object murx;
+ murx.initReal(mediaBox->x1);
+ Object mury;
+ mury.initReal(mediaBox->y1);
+ Object mllx;
+ mllx.initReal(mediaBox->x2);
+ Object mlly;
+ mlly.initReal(mediaBox->y2);
+ mediaBoxObj.arrayAdd(&murx);
+ mediaBoxObj.arrayAdd(&mury);
+ mediaBoxObj.arrayAdd(&mllx);
+ mediaBoxObj.arrayAdd(&mlly);
+ pageDict->add(copyString("MediaBox"), &mediaBoxObj);
if (cropBox != NULL) {
- Object *cropBoxObj = new Object();
- cropBoxObj->initArray(getXRef());
- Object *curx = new Object();
- curx->initReal(cropBox->x1);
- Object *cury = new Object();
- cury->initReal(cropBox->y1);
- Object *cllx = new Object();
- cllx->initReal(cropBox->x2);
- Object *clly = new Object();
- clly->initReal(cropBox->y2);
- cropBoxObj->arrayAdd(curx);
- cropBoxObj->arrayAdd(cury);
- cropBoxObj->arrayAdd(cllx);
- cropBoxObj->arrayAdd(clly);
- pageDict->add(copyString("CropBox"), cropBoxObj);
- pageDict->add(copyString("TrimBox"), cropBoxObj);
+ Object cropBoxObj;
+ cropBoxObj.initArray(getXRef());
+ Object curx;
+ curx.initReal(cropBox->x1);
+ Object cury;
+ cury.initReal(cropBox->y1);
+ Object cllx;
+ cllx.initReal(cropBox->x2);
+ Object clly;
+ clly.initReal(cropBox->y2);
+ cropBoxObj.arrayAdd(&curx);
+ cropBoxObj.arrayAdd(&cury);
+ cropBoxObj.arrayAdd(&cllx);
+ cropBoxObj.arrayAdd(&clly);
+ pageDict->add(copyString("CropBox"), &cropBoxObj);
+ cropBoxObj.getArray()->incRef();
+ pageDict->add(copyString("TrimBox"), &cropBoxObj);
} else {
- pageDict->add(copyString("TrimBox"), mediaBoxObj);
- }
- Object *rotateObj = new Object();
- rotateObj->initInt(rotate);
- pageDict->add(copyString("Rotate"), rotateObj);
- if (pageCTM != NULL) {
- Object *contents = new Object();
- Ref cmRef = getXRef()->addIndirectObject(pageCTM);
- Object *ref = new Object();
- ref->initRef(cmRef.num, cmRef.gen);
- pageDict->lookupNF("Contents", contents);
- Object *newContents = new Object();
- newContents->initArray(getXRef());
- if (contents->getType() == objRef) {
- newContents->arrayAdd(ref);
- newContents->arrayAdd(contents);
- } else {
- newContents->arrayAdd(ref);
- for (int i = 0; i < contents->arrayGetLength(); i++) {
- Object *contentEle = new Object();
- contents->arrayGetNF(i, contentEle);
- newContents->arrayAdd(contentEle);
- }
- }
- pageDict->remove("Contents");
- pageDict->add(copyString("Contents"), newContents);
+ mediaBoxObj.getArray()->incRef();
+ pageDict->add(copyString("TrimBox"), &mediaBoxObj);
}
+ Object rotateObj;
+ rotateObj.initInt(rotate);
+ pageDict->add(copyString("Rotate"), &rotateObj);
getXRef()->setModifiedObject(&page, *refPage);
page.free();
}
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index a73953c7..bb72476b 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -247,7 +247,7 @@ public:
void *getGUIData() { return guiData; }
// rewrite pageDict with MediaBox, CropBox and new page CTM
- void replacePageDict(int pageNo, int rotate, PDFRectangle *mediaBox, PDFRectangle *cropBox, Object *pageCTM);
+ void replacePageDict(int pageNo, int rotate, PDFRectangle *mediaBox, PDFRectangle *cropBox);
void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum);
GBool markAnnotations(Object *annots, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum);
void markAcroForm(Object *acrpForm, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum);
diff --git a/utils/pdfseparate.cc b/utils/pdfseparate.cc
index 31dc18ce..bc98c7d1 100644
--- a/utils/pdfseparate.cc
+++ b/utils/pdfseparate.cc
@@ -54,6 +54,7 @@ bool extractPages (const char *srcFileName, const char *destFileName) {
if (!doc->isOk()) {
error(errSyntaxError, -1, "Could not extract page(s) from damaged file ('{0:s}')", srcFileName);
+ delete doc;
return false;
}
@@ -74,6 +75,7 @@ bool extractPages (const char *srcFileName, const char *destFileName) {
error(errCommandLine, -1,
"Wrong page range given: the first page ({0:d}) can not be after the last page ({1:d}).",
firstPage, lastPage);
+ delete doc;
return false;
}
bool foundmatch = false;
@@ -97,6 +99,7 @@ bool extractPages (const char *srcFileName, const char *destFileName) {
if (!foundmatch && firstPage != lastPage) {
error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName);
free(auxDestFileName);
+ delete doc;
return false;
}
@@ -113,6 +116,7 @@ bool extractPages (const char *srcFileName, const char *destFileName) {
if (p != NULL) {
error(errSyntaxError, -1, "'{0:s}' can only contain one '%d' pattern", destFileName);
free(auxDestFileName);
+ delete doc;
return false;
}
free(auxDestFileName);
@@ -123,12 +127,12 @@ bool extractPages (const char *srcFileName, const char *destFileName) {
int errCode = doc->savePageAs(gpageName, pageNo);
if ( errCode != errNone) {
delete gpageName;
- delete gfileName;
+ delete doc;
return false;
}
delete gpageName;
}
- delete gfileName;
+ delete doc;
return true;
}
diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc
index 787b1f07..05a05603 100644
--- a/utils/pdfunite.cc
+++ b/utils/pdfunite.cc
@@ -7,7 +7,7 @@
// Copyright (C) 2011-2014 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2012 Arseny Solokha <asolokha@gmx.com>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
-// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012, 2014 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2013 Hib Eris <hib@hiberis.nl>
//
@@ -116,7 +116,7 @@ int main (int argc, char *argv[])
cropBox = docs[i]->getCatalog()->getPage(j)->getCropBox();
docs[i]->replacePageDict(j,
docs[i]->getCatalog()->getPage(j)->getRotate(),
- docs[i]->getCatalog()->getPage(j)->getMediaBox(), cropBox, NULL);
+ docs[i]->getCatalog()->getPage(j)->getMediaBox(), cropBox);
Ref *refPage = docs[i]->getCatalog()->getPageRef(j);
Object page;
docs[i]->getXRef()->fetch(refPage->num, refPage->gen, &page);