summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2018-10-01 20:02:59 +0800
committerTor Andersson <tor.andersson@artifex.com>2018-10-23 18:46:01 +0200
commit8318f36398aee997232caa9b16c7c998b1b0c891 (patch)
tree9643a10f831d96b8e998785878babfcd20a49e79 /source
parent7601b617a9766adc3d4b79608a6aa4febfa40529 (diff)
downloadmupdf-8318f36398aee997232caa9b16c7c998b1b0c891.tar.xz
When copying streams drop resources upon exception.
Diffstat (limited to 'source')
-rw-r--r--source/pdf/pdf-write.c166
1 files changed, 87 insertions, 79 deletions
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c
index 227258d8..dd7201da 100644
--- a/source/pdf/pdf-write.c
+++ b/source/pdf/pdf-write.c
@@ -1669,117 +1669,125 @@ static void write_data(fz_context *ctx, void *arg, const unsigned char *data, in
static void copystream(fz_context *ctx, pdf_document *doc, pdf_write_state *opts, pdf_obj *obj_orig, int num, int gen, int do_deflate)
{
- fz_buffer *buf, *tmp;
- pdf_obj *obj;
+ fz_buffer *tmp = NULL, *buf = NULL;
+ pdf_obj *obj = NULL;
size_t len;
unsigned char *data;
- buf = pdf_load_raw_stream_number(ctx, doc, num);
-
- obj = pdf_copy_dict(ctx, obj_orig);
+ fz_var(buf);
+ fz_var(tmp);
+ fz_var(obj);
- len = fz_buffer_storage(ctx, buf, &data);
- if (do_deflate && !pdf_dict_get(ctx, obj, PDF_NAME(Filter)))
+ fz_try(ctx)
{
- size_t clen;
- unsigned char *cdata;
- tmp = deflatebuf(ctx, data, len);
- clen = fz_buffer_storage(ctx, tmp, &cdata);
- if (clen >= len)
+ buf = pdf_load_raw_stream_number(ctx, doc, num);
+ obj = pdf_copy_dict(ctx, obj_orig);
+
+ len = fz_buffer_storage(ctx, buf, &data);
+ if (do_deflate && !pdf_dict_get(ctx, obj, PDF_NAME(Filter)))
{
- /* Don't bother compressing, as we gain nothing. */
- fz_drop_buffer(ctx, tmp);
+ size_t clen;
+ unsigned char *cdata;
+ tmp = deflatebuf(ctx, data, len);
+ clen = fz_buffer_storage(ctx, tmp, &cdata);
+ if (clen < len)
+ {
+ len = clen;
+ data = cdata;
+ pdf_dict_put(ctx, obj, PDF_NAME(Filter), PDF_NAME(FlateDecode));
+ }
}
- else
+
+ if (opts->do_ascii && isbinarystream(ctx, buf))
{
- len = clen;
- data = cdata;
- pdf_dict_put(ctx, obj, PDF_NAME(Filter), PDF_NAME(FlateDecode));
- fz_drop_buffer(ctx, buf);
- buf = tmp;
+ tmp = hexbuf(ctx, data, len);
+ len = fz_buffer_storage(ctx, tmp, &data);
+ addhexfilter(ctx, doc, obj);
}
- }
- if (opts->do_ascii && isbinarystream(ctx, buf))
+ pdf_dict_put_int(ctx, obj, PDF_NAME(Length), pdf_encrypted_len(ctx, doc->crypt, num, gen, (int)len));
+
+ fz_write_printf(ctx, opts->out, "%d %d obj\n", num, gen);
+ pdf_print_encrypted_obj(ctx, opts->out, obj, opts->do_tight, doc->crypt, num, gen);
+ fz_write_string(ctx, opts->out, "\nstream\n");
+ pdf_encrypt_data(ctx, doc->crypt, num, gen, write_data, opts->out, data, len);
+ fz_write_string(ctx, opts->out, "\nendstream\nendobj\n\n");
+ }
+ fz_always(ctx)
{
- tmp = hexbuf(ctx, data, len);
+ fz_drop_buffer(ctx, tmp);
fz_drop_buffer(ctx, buf);
- buf = tmp;
- len = fz_buffer_storage(ctx, buf, &data);
-
- addhexfilter(ctx, doc, obj);
+ pdf_drop_obj(ctx, obj);
+ }
+ fz_catch(ctx)
+ {
+ fz_rethrow(ctx);
}
- pdf_dict_put_int(ctx, obj, PDF_NAME(Length), pdf_encrypted_len(ctx, doc->crypt, num, gen, (int)len));
-
- fz_write_printf(ctx, opts->out, "%d %d obj\n", num, gen);
- pdf_print_encrypted_obj(ctx, opts->out, obj, opts->do_tight, doc->crypt, num, gen);
- fz_write_string(ctx, opts->out, "\nstream\n");
- pdf_encrypt_data(ctx, doc->crypt, num, gen, write_data, opts->out, data, len);
- fz_write_string(ctx, opts->out, "\nendstream\nendobj\n\n");
-
- fz_drop_buffer(ctx, buf);
- pdf_drop_obj(ctx, obj);
}
static void expandstream(fz_context *ctx, pdf_document *doc, pdf_write_state *opts, pdf_obj *obj_orig, int num, int gen, int do_deflate)
{
- fz_buffer *buf, *tmp;
- pdf_obj *obj;
+ fz_buffer *buf = NULL, *tmp = NULL;
+ pdf_obj *obj = NULL;
int truncated = 0;
size_t len;
unsigned char *data;
- buf = pdf_load_stream_truncated(ctx, doc, num, (opts->continue_on_error ? &truncated : NULL));
- if (truncated && opts->errors)
- (*opts->errors)++;
-
- obj = pdf_copy_dict(ctx, obj_orig);
- pdf_dict_del(ctx, obj, PDF_NAME(Filter));
- pdf_dict_del(ctx, obj, PDF_NAME(DecodeParms));
+ fz_var(buf);
+ fz_var(tmp);
+ fz_var(obj);
- len = fz_buffer_storage(ctx, buf, &data);
- if (do_deflate)
+ fz_try(ctx)
{
- unsigned char *cdata;
- size_t clen;
- tmp = deflatebuf(ctx, data, len);
- clen = fz_buffer_storage(ctx, tmp, &cdata);
- if (clen >= len)
+ buf = pdf_load_stream_truncated(ctx, doc, num, (opts->continue_on_error ? &truncated : NULL));
+ if (truncated && opts->errors)
+ (*opts->errors)++;
+
+ obj = pdf_copy_dict(ctx, obj_orig);
+ pdf_dict_del(ctx, obj, PDF_NAME(Filter));
+ pdf_dict_del(ctx, obj, PDF_NAME(DecodeParms));
+
+ len = fz_buffer_storage(ctx, buf, &data);
+ if (do_deflate)
{
- /* Don't bother compressing, as we gain nothing. */
- fz_drop_buffer(ctx, tmp);
+ unsigned char *cdata;
+ size_t clen;
+ tmp = deflatebuf(ctx, data, len);
+ clen = fz_buffer_storage(ctx, tmp, &cdata);
+ if (clen < len)
+ {
+ len = clen;
+ data = cdata;
+ pdf_dict_put(ctx, obj, PDF_NAME(Filter), PDF_NAME(FlateDecode));
+ }
}
- else
+
+ if (opts->do_ascii && isbinarystream(ctx, buf))
{
- len = clen;
- data = cdata;
- pdf_dict_put(ctx, obj, PDF_NAME(Filter), PDF_NAME(FlateDecode));
- fz_drop_buffer(ctx, buf);
- buf = tmp;
+ tmp = hexbuf(ctx, data, len);
+ len = fz_buffer_storage(ctx, buf, &data);
+ addhexfilter(ctx, doc, obj);
}
- }
- if (opts->do_ascii && isbinarystream(ctx, buf))
+ pdf_dict_put_int(ctx, obj, PDF_NAME(Length), len);
+
+ fz_write_printf(ctx, opts->out, "%d %d obj\n", num, gen);
+ pdf_print_encrypted_obj(ctx, opts->out, obj, opts->do_tight, doc->crypt, num, gen);
+ fz_write_string(ctx, opts->out, "\nstream\n");
+ fz_write_data(ctx, opts->out, data, len);
+ fz_write_string(ctx, opts->out, "\nendstream\nendobj\n\n");
+ }
+ fz_always(ctx)
{
- tmp = hexbuf(ctx, data, len);
+ fz_drop_buffer(ctx, tmp);
fz_drop_buffer(ctx, buf);
- buf = tmp;
- len = fz_buffer_storage(ctx, buf, &data);
-
- addhexfilter(ctx, doc, obj);
+ pdf_drop_obj(ctx, obj);
+ }
+ fz_catch(ctx)
+ {
+ fz_rethrow(ctx);
}
-
- pdf_dict_put_int(ctx, obj, PDF_NAME(Length), len);
-
- fz_write_printf(ctx, opts->out, "%d %d obj\n", num, gen);
- pdf_print_encrypted_obj(ctx, opts->out, obj, opts->do_tight, doc->crypt, num, gen);
- fz_write_string(ctx, opts->out, "\nstream\n");
- fz_write_data(ctx, opts->out, data, len);
- fz_write_string(ctx, opts->out, "\nendstream\nendobj\n\n");
-
- fz_drop_buffer(ctx, buf);
- pdf_drop_obj(ctx, obj);
}
static int is_image_filter(const char *s)