[poppler] poppler/Outline.cc
Albert Astals Cid
aacid at kemper.freedesktop.org
Mon Mar 2 15:56:45 PST 2009
poppler/Outline.cc | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
New commits:
commit 4dfa7460ddc4b5684d5ef8db17efa50b95b7b735
Author: Nick Jones <nick.jones at network-box.com>
Date: Tue Mar 3 00:55:53 2009 +0100
Do not blindly follow loops parsing OutlineItem
More details in bug 18364
diff --git a/poppler/Outline.cc b/poppler/Outline.cc
index 8a2a791..bd4e6d0 100644
--- a/poppler/Outline.cc
+++ b/poppler/Outline.cc
@@ -15,6 +15,7 @@
//
// Copyright (C) 2005 Marco Pesenti Gritti <mpg at redhat.com>
// Copyright (C) 2008 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2009 Nick Jones <nick.jones at network-box.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -30,6 +31,7 @@
#include "goo/gmem.h"
#include "goo/GooString.h"
#include "goo/GooList.h"
+#include "XRef.h"
#include "Link.h"
#include "PDFDocEncoding.h"
#include "Outline.h"
@@ -129,6 +131,7 @@ OutlineItem::~OutlineItem() {
GooList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef,
XRef *xrefA) {
GooList *items;
+ char* alreadyRead;
OutlineItem *item;
Object obj;
Object *p;
@@ -137,12 +140,20 @@ GooList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef,
return NULL;
items = new GooList();
+
+ alreadyRead = (char *)gmalloc(xrefA->getNumObjects());
+ memset(alreadyRead, 0, xrefA->getNumObjects());
+
p = firstItemRef;
- while (p->isRef()) {
+ while (p->isRef() &&
+ (p->getRefNum() >= 0) &&
+ (p->getRefNum() < xrefA->getNumObjects()) &&
+ !alreadyRead[p->getRefNum()]) {
if (!p->fetch(xrefA, &obj)->isDict()) {
obj.free();
break;
}
+ alreadyRead[p->getRefNum()] = 1;
item = new OutlineItem(obj.getDict(), xrefA);
obj.free();
items->append(item);
@@ -153,6 +164,8 @@ GooList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef,
p = &item->nextRef;
}
+ gfree(alreadyRead);
+
if (!items->getLength()) {
delete items;
items = NULL;
More information about the poppler
mailing list