poppler/Outline.cc | 31 +++++++++++++++++-------------- poppler/Outline.h | 6 ++++-- 2 files changed, 21 insertions(+), 16 deletions(-)
New commits: commit e41ce80a27b735df8e2ccc17e15adea012543712 Author: Albert Astals Cid <aa...@kde.org> Date: Wed Dec 27 00:18:47 2017 +0100 OutlineItem: Store parent and refNum This way when opening our children we make sure they are not also our parent (i.e. there's a loop) Fixes bug #102914 diff --git a/poppler/Outline.cc b/poppler/Outline.cc index 82f28663..bd32ec0b 100644 --- a/poppler/Outline.cc +++ b/poppler/Outline.cc @@ -47,7 +47,7 @@ Outline::Outline(Object *outlineObj, XRef *xref) { return; } Object first = outlineObj->dictLookupNF("First"); - items = OutlineItem::readItemList(&first, xref); + items = OutlineItem::readItemList(nullptr, &first, xref); } Outline::~Outline() { @@ -58,9 +58,11 @@ Outline::~Outline() { //------------------------------------------------------------------------ -OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) { +OutlineItem::OutlineItem(Dict *dict, int refNumA, OutlineItem *parentA, XRef *xrefA) { Object obj1; + refNum = refNumA; + parent = parentA; xref = xrefA; title = NULL; action = NULL; @@ -108,28 +110,29 @@ OutlineItem::~OutlineItem() { } } -GooList *OutlineItem::readItemList(Object *firstItemRef, XRef *xrefA) { - GooList *items; - char* alreadyRead; - OutlineItem *item; - Object *p; +GooList *OutlineItem::readItemList(OutlineItem *parent, Object *firstItemRef, XRef *xrefA) { + GooList *items = new GooList(); - items = new GooList(); - - alreadyRead = (char *)gmalloc(xrefA->getNumObjects()); + char* alreadyRead = (char *)gmalloc(xrefA->getNumObjects()); memset(alreadyRead, 0, xrefA->getNumObjects()); - p = firstItemRef; + OutlineItem *parentO = parent; + while (parentO) { + alreadyRead[parentO->refNum] = 1; + parentO = parentO->parent; + } + + Object *p = firstItemRef; while (p->isRef() && (p->getRefNum() >= 0) && - (p->getRefNum() < xrefA->getNumObjects()) && + (p->getRefNum() < xrefA->getNumObjects()) && !alreadyRead[p->getRefNum()]) { Object obj = p->fetch(xrefA); if (!obj.isDict()) { break; } alreadyRead[p->getRefNum()] = 1; - item = new OutlineItem(obj.getDict(), xrefA); + OutlineItem *item = new OutlineItem(obj.getDict(), p->getRefNum(), parent, xrefA); items->append(item); p = &item->nextRef; } @@ -146,7 +149,7 @@ GooList *OutlineItem::readItemList(Object *firstItemRef, XRef *xrefA) { void OutlineItem::open() { if (!kids) { - kids = readItemList(&firstRef, xref); + kids = readItemList(this, &firstRef, xref); } } diff --git a/poppler/Outline.h b/poppler/Outline.h index 46775d59..1585d0e4 100644 --- a/poppler/Outline.h +++ b/poppler/Outline.h @@ -57,10 +57,10 @@ private: class OutlineItem { public: - OutlineItem(Dict *dict, XRef *xrefA); + OutlineItem(Dict *dict, int refNumA, OutlineItem *parentA, XRef *xrefA); ~OutlineItem(); - static GooList *readItemList(Object *firstItemRef, XRef *xrefA); + static GooList *readItemList(OutlineItem *parent, Object *firstItemRef, XRef *xrefA); void open(); void close(); @@ -74,6 +74,8 @@ public: private: + int refNum; + OutlineItem *parent; XRef *xref; Unicode *title; int titleLen; _______________________________________________ poppler mailing list poppler@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/poppler