diff options
-rw-r--r-- | source/pdf/pdf-object.c | 4 | ||||
-rw-r--r-- | source/pdf/pdf-write.c | 15 |
2 files changed, 15 insertions, 4 deletions
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c index eff0128b..0ee399c5 100644 --- a/source/pdf/pdf-object.c +++ b/source/pdf/pdf-object.c @@ -158,6 +158,10 @@ pdf_new_indirect(pdf_document *doc, int num, int gen) { pdf_obj *obj; fz_context *ctx = doc->ctx; + + if (num <= 0 || gen < 0) + fz_throw(ctx, FZ_ERROR_GENERIC, "Invalid num (%d) or gen (%d) for indirection", num, gen); + obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(indirect)"); obj->doc = doc; obj->refs = 1; diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c index 36fda444..b5894421 100644 --- a/source/pdf/pdf-write.c +++ b/source/pdf/pdf-write.c @@ -723,7 +723,7 @@ static void renumberobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj if (pdf_is_indirect(val)) { int o = pdf_to_num(val); - if (o >= xref_len) + if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0) val = pdf_new_null(doc); else val = pdf_new_indirect(doc, opts->renumber_map[o], 0); @@ -746,7 +746,7 @@ static void renumberobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj if (pdf_is_indirect(val)) { int o = pdf_to_num(val); - if (o >= xref_len) + if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0) val = pdf_new_null(doc); else val = pdf_new_indirect(doc, opts->renumber_map[o], 0); @@ -779,11 +779,18 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts) renumberobj(doc, opts, pdf_trailer(doc)); for (num = 0; num < xref_len; num++) { - pdf_obj *obj = pdf_get_xref_entry(doc, num)->obj; + pdf_obj *obj; + int to = opts->renumber_map[num]; + + /* If object is going to be dropped, don't bother renumbering */ + if (to == 0) + continue; + + obj = pdf_get_xref_entry(doc, num)->obj; if (pdf_is_indirect(obj)) { - obj = pdf_new_indirect(doc, opts->renumber_map[pdf_to_num(obj)], 0); + obj = pdf_new_indirect(doc, to, 0); pdf_update_object(doc, num, obj); pdf_drop_obj(obj); } |