summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-07-16 10:21:45 +0000
committerTor Andersson <tor@ghostscript.com>2010-07-16 10:21:45 +0000
commitf3e1ef3bfd76293346d5108e2df9a877fe583a5d (patch)
treec05a95a640fb3ab02457e6c9413d06a7f3b58360
parent36aad51f7c3e65ea0ebad3683e96440bb9282177 (diff)
downloadmupdf-f3e1ef3bfd76293346d5108e2df9a877fe583a5d.tar.xz
Prevent infinite recursion when loading page tree.
-rw-r--r--mupdf/pdf_page.c11
-rw-r--r--mupdf/pdf_pagetree.c8
2 files changed, 16 insertions, 3 deletions
diff --git a/mupdf/pdf_page.c b/mupdf/pdf_page.c
index 71087336..57f7bb49 100644
--- a/mupdf/pdf_page.c
+++ b/mupdf/pdf_page.c
@@ -124,19 +124,24 @@ pdf_resourcesuseblending(fz_obj *rdb)
dict = fz_dictgets(rdb, "ExtGState");
for (i = 0; i < fz_dictlen(dict); i++)
if (pdf_extgstateusesblending(fz_dictgetval(dict, i)))
- return 1;
+ goto found;
dict = fz_dictgets(rdb, "Pattern");
for (i = 0; i < fz_dictlen(dict); i++)
if (pdf_patternusesblending(fz_dictgetval(dict, i)))
- return 1;
+ goto found;
dict = fz_dictgets(rdb, "XObject");
for (i = 0; i < fz_dictlen(dict); i++)
if (pdf_xobjectusesblending(fz_dictgetval(dict, i)))
- return 1;
+ goto found;
+ fz_dictdels(rdb, ".seen");
return 0;
+
+found:
+ fz_dictdels(rdb, ".seen");
+ return 1;
}
fz_error
diff --git a/mupdf/pdf_pagetree.c b/mupdf/pdf_pagetree.c
index b58802a8..660f77ee 100644
--- a/mupdf/pdf_pagetree.c
+++ b/mupdf/pdf_pagetree.c
@@ -52,6 +52,10 @@ pdf_loadpagetreenode(pdf_xref *xref, fz_obj *node, struct info info)
fz_obj *obj;
int i, n;
+ /* prevent infinite recursion */
+ if (fz_dictgets(node, ".seen"))
+ return;
+
kids = fz_dictgets(node, "Kids");
count = fz_dictgets(node, "Count");
@@ -70,12 +74,16 @@ pdf_loadpagetreenode(pdf_xref *xref, fz_obj *node, struct info info)
if (obj)
info.rotate = obj;
+ fz_dictputs(node, ".seen", fz_newnull());
+
n = fz_arraylen(kids);
for (i = 0; i < n; i++)
{
obj = fz_arrayget(kids, i);
pdf_loadpagetreenode(xref, obj, info);
}
+
+ fz_dictdels(node, ".seen");
}
else
{