summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pdf/pdf_deref.c32
-rw-r--r--pdf/pdf_doc.c10
-rw-r--r--pdf/pdf_mark.c12
3 files changed, 44 insertions, 10 deletions
diff --git a/pdf/pdf_deref.c b/pdf/pdf_deref.c
index 5781c0b69..34312aed0 100644
--- a/pdf/pdf_deref.c
+++ b/pdf/pdf_deref.c
@@ -1015,7 +1015,20 @@ static int pdfi_resolve_indirect_array(pdf_context *ctx, pdf_obj *obj, bool recu
arraysize = pdfi_array_size(array);
for (index = 0; index < arraysize; index++) {
+ if (ctx->loop_detection != NULL) {
+ code = pdfi_loop_detector_mark(ctx);
+ if (code < 0)
+ return code;
+ }
+
code = pdfi_array_get_no_store_R(ctx, array, index, &object);
+
+ if (ctx->loop_detection != NULL) {
+ int code1 = pdfi_loop_detector_cleartomark(ctx);
+ if (code1 < 0)
+ return code1;
+ }
+
if (code == gs_error_circular_reference) {
/* Just leave as an indirect ref */
code = 0;
@@ -1055,7 +1068,21 @@ static int pdfi_resolve_indirect_dict(pdf_context *ctx, pdf_obj *obj, bool recur
Key = (pdf_name *)dict->keys[index];
if (pdfi_name_is(Key, "Parent"))
continue;
+
+ if (ctx->loop_detection != NULL) {
+ code = pdfi_loop_detector_mark(ctx);
+ if (code < 0)
+ return code;
+ }
+
code = pdfi_dict_get_no_store_R_key(ctx, dict, Key, &Value);
+
+ if (ctx->loop_detection != NULL) {
+ int code1 = pdfi_loop_detector_cleartomark(ctx);
+ if (code1 < 0)
+ return code1;
+ }
+
if (code == gs_error_circular_reference) {
/* Just leave as an indirect ref */
code = 0;
@@ -1112,7 +1139,12 @@ int pdfi_resolve_indirect_loop_detect(pdf_context *ctx, pdf_obj *parent, pdf_obj
code = pdfi_loop_detector_add_object(ctx, parent->object_num);
if (code < 0) goto exit;
}
+
if (value->object_num != 0) {
+ if (pdfi_loop_detector_check_object(ctx, value->object_num)) {
+ code = gs_note_error(gs_error_circular_reference);
+ goto exit;
+ }
code = pdfi_loop_detector_add_object(ctx, value->object_num);
if (code < 0) goto exit;
}
diff --git a/pdf/pdf_doc.c b/pdf/pdf_doc.c
index 70bd4f23a..35be01846 100644
--- a/pdf/pdf_doc.c
+++ b/pdf/pdf_doc.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2020-2021 Artifex Software, Inc.
+/* Copyright (C) 2020-2022 Artifex Software, Inc.
All Rights Reserved.
This software is provided AS-IS with no warranty, either express or
@@ -1061,12 +1061,20 @@ static int pdfi_doc_PageLabels(pdf_context *ctx)
int code;
pdf_dict *PageLabels = NULL;
+ if (ctx->loop_detection)
+ code = pdfi_loop_detector_mark(ctx);
+
code = pdfi_dict_knownget_type(ctx, ctx->Root, "PageLabels", PDF_DICT, (pdf_obj **)&PageLabels);
if (code <= 0) {
+ if (ctx->loop_detection)
+ code = pdfi_loop_detector_cleartomark(ctx);
/* TODO: flag a warning */
goto exit;
}
+ if (ctx->loop_detection)
+ code = pdfi_loop_detector_cleartomark(ctx);
+
/* This will send the PageLabels object as a 'pdfpagelabels' setdeviceparams */
code = pdfi_mark_object(ctx, (pdf_obj *)PageLabels, "pdfpagelabels");
if (code < 0)
diff --git a/pdf/pdf_mark.c b/pdf/pdf_mark.c
index 672d65111..644adf5fa 100644
--- a/pdf/pdf_mark.c
+++ b/pdf/pdf_mark.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2020-2021 Artifex Software, Inc.
+/* Copyright (C) 2020-2022 Artifex Software, Inc.
All Rights Reserved.
This software is provided AS-IS with no warranty, either express or
@@ -348,14 +348,8 @@ int pdfi_mark_object(pdf_context *ctx, pdf_obj *object, const char *cmd)
code = pdfi_loop_detector_mark(ctx);
if (code < 0)
goto exit;
- if (object->object_num != 0) {
- code = pdfi_loop_detector_add_object(ctx, object->object_num);
- if (code < 0) {
- (void)pdfi_loop_detector_cleartomark(ctx);
- goto exit;
- }
- }
- code = pdfi_resolve_indirect(ctx, object, true);
+
+ code = pdfi_resolve_indirect_loop_detect(ctx, NULL, object, true);
(void)pdfi_loop_detector_cleartomark(ctx);
if (code < 0)
goto exit;