diff options
-rw-r--r-- | source/pdf/pdf-write.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c index a7326a173..bc67f0030 100644 --- a/source/pdf/pdf-write.c +++ b/source/pdf/pdf-write.c | |||
@@ -634,7 +634,8 @@ expand_lists(fz_context *ctx, pdf_write_state *opts, int num) | |||
634 | { | 634 | { |
635 | int i; | 635 | int i; |
636 | 636 | ||
637 | num++; | 637 | /* objects are numbered 0..num and maybe two additional objects for linearization */ |
638 | num += 3; | ||
638 | opts->use_list = fz_resize_array(ctx, opts->use_list, num, sizeof(*opts->use_list)); | 639 | opts->use_list = fz_resize_array(ctx, opts->use_list, num, sizeof(*opts->use_list)); |
639 | opts->ofs_list = fz_resize_array(ctx, opts->ofs_list, num, sizeof(*opts->ofs_list)); | 640 | opts->ofs_list = fz_resize_array(ctx, opts->ofs_list, num, sizeof(*opts->ofs_list)); |
640 | opts->gen_list = fz_resize_array(ctx, opts->gen_list, num, sizeof(*opts->gen_list)); | 641 | opts->gen_list = fz_resize_array(ctx, opts->gen_list, num, sizeof(*opts->gen_list)); |
@@ -1524,9 +1525,9 @@ static void preloadobjstms(fz_context *ctx, pdf_document *doc) | |||
1524 | { | 1525 | { |
1525 | pdf_obj *obj; | 1526 | pdf_obj *obj; |
1526 | int num; | 1527 | int num; |
1527 | int xref_len = pdf_xref_len(ctx, doc); | ||
1528 | 1528 | ||
1529 | for (num = 0; num < xref_len; num++) | 1529 | /* xref_len may change due to repair, so check it every iteration */ |
1530 | for (num = 0; num < pdf_xref_len(ctx, doc); num++) | ||
1530 | { | 1531 | { |
1531 | if (pdf_get_xref_entry(ctx, doc, num)->type == 'o') | 1532 | if (pdf_get_xref_entry(ctx, doc, num)->type == 'o') |
1532 | { | 1533 | { |
@@ -2772,7 +2773,7 @@ static void initialise_write_state(fz_context *ctx, pdf_document *doc, const pdf | |||
2772 | opts->continue_on_error = in_opts->continue_on_error; | 2773 | opts->continue_on_error = in_opts->continue_on_error; |
2773 | opts->errors = in_opts->errors; | 2774 | opts->errors = in_opts->errors; |
2774 | 2775 | ||
2775 | expand_lists(ctx, opts, xref_len + 3); | 2776 | expand_lists(ctx, opts, xref_len); |
2776 | } | 2777 | } |
2777 | 2778 | ||
2778 | /* Free the resources held by the dynamic write options */ | 2779 | /* Free the resources held by the dynamic write options */ |
@@ -2926,8 +2927,9 @@ do_pdf_save_document(fz_context *ctx, pdf_document *doc, pdf_write_state *opts, | |||
2926 | { | 2927 | { |
2927 | pdf_ensure_solid_xref(ctx, doc, xref_len); | 2928 | pdf_ensure_solid_xref(ctx, doc, xref_len); |
2928 | preloadobjstms(ctx, doc); | 2929 | preloadobjstms(ctx, doc); |
2929 | |||
2930 | change_identity(ctx, doc); | 2930 | change_identity(ctx, doc); |
2931 | xref_len = pdf_xref_len(ctx, doc); /* May have changed due to repair */ | ||
2932 | expand_lists(ctx, opts, xref_len); | ||
2931 | } | 2933 | } |
2932 | 2934 | ||
2933 | /* Sweep & mark objects from the trailer */ | 2935 | /* Sweep & mark objects from the trailer */ |
@@ -2936,6 +2938,7 @@ do_pdf_save_document(fz_context *ctx, pdf_document *doc, pdf_write_state *opts, | |||
2936 | else | 2938 | else |
2937 | { | 2939 | { |
2938 | xref_len = pdf_xref_len(ctx, doc); /* May have changed due to repair */ | 2940 | xref_len = pdf_xref_len(ctx, doc); /* May have changed due to repair */ |
2941 | expand_lists(ctx, opts, xref_len); | ||
2939 | for (num = 0; num < xref_len; num++) | 2942 | for (num = 0; num < xref_len; num++) |
2940 | opts->use_list[num] = 1; | 2943 | opts->use_list[num] = 1; |
2941 | } | 2944 | } |
@@ -2964,6 +2967,7 @@ do_pdf_save_document(fz_context *ctx, pdf_document *doc, pdf_write_state *opts, | |||
2964 | if ((opts->do_garbage >= 2 || opts->do_linear) && !opts->do_incremental) | 2967 | if ((opts->do_garbage >= 2 || opts->do_linear) && !opts->do_incremental) |
2965 | { | 2968 | { |
2966 | xref_len = pdf_xref_len(ctx, doc); /* May have changed due to repair */ | 2969 | xref_len = pdf_xref_len(ctx, doc); /* May have changed due to repair */ |
2970 | expand_lists(ctx, opts, xref_len); | ||
2967 | while (xref_len > 0 && !opts->use_list[xref_len-1]) | 2971 | while (xref_len > 0 && !opts->use_list[xref_len-1]) |
2968 | xref_len--; | 2972 | xref_len--; |
2969 | } | 2973 | } |