summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/pdf/pdf-write.c14
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 }