diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-07-11 14:25:19 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2018-08-10 14:09:46 +0200 |
commit | f149c37230a5551753d35ab7257d5d31b9e51485 (patch) | |
tree | 388b25cbaad9c18b8f15554c31755012c39fbc3c /source/pdf/pdf-object.c | |
parent | 84c0c62018110e0cbb01d30d4df96b64e0b6899f (diff) | |
download | mupdf-f149c37230a5551753d35ab7257d5d31b9e51485.tar.xz |
Detect cycles in pdf_dict_get_inheritable.
Remove duplicate function pdf_lookup_inherited_page_item.
Diffstat (limited to 'source/pdf/pdf-object.c')
-rw-r--r-- | source/pdf/pdf-object.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c index d4f504d3..295cfc5c 100644 --- a/source/pdf/pdf-object.c +++ b/source/pdf/pdf-object.c @@ -2156,15 +2156,42 @@ int pdf_obj_refs(fz_context *ctx, pdf_obj *obj) /* Convenience functions */ -pdf_obj *pdf_dict_get_inheritable(fz_context *ctx, pdf_obj *dict, pdf_obj *key) +pdf_obj * +pdf_dict_get_inheritable(fz_context *ctx, pdf_obj *node, pdf_obj *key) { + pdf_obj *node2 = node; pdf_obj *val = NULL; - while (!val && dict) + + fz_var(node); + fz_try(ctx) + { + do + { + val = pdf_dict_get(ctx, node, key); + if (val) + break; + if (pdf_mark_obj(ctx, node)) + fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in tree (parents)"); + node = pdf_dict_get(ctx, node, PDF_NAME(Parent)); + } + while (node); + } + fz_always(ctx) + { + do + { + pdf_unmark_obj(ctx, node2); + if (node2 == node) + break; + node2 = pdf_dict_get(ctx, node2, PDF_NAME(Parent)); + } + while (node2); + } + fz_catch(ctx) { - val = pdf_dict_get(ctx, dict, key); - if (!val) - dict = pdf_dict_get(ctx, dict, PDF_NAME(Parent)); + fz_rethrow(ctx); } + return val; } |