diff options
-rw-r--r-- | pdf/pdf_deref.c | 32 | ||||
-rw-r--r-- | pdf/pdf_doc.c | 10 | ||||
-rw-r--r-- | pdf/pdf_mark.c | 12 |
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; |