summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2016-10-30 11:39:03 +0800
committerSebastian Rasmussen <sebras@gmail.com>2016-11-23 23:31:53 +0800
commitf6e993b94bc9b21342decf41865c7e4c81fada1e (patch)
treee2b0421ea72ea9baa2da60e02d4390297cbfad7a
parent9c0a767a678fcf3aa70ef98c356b911f4a405450 (diff)
downloadmupdf-f6e993b94bc9b21342decf41865c7e4c81fada1e.tar.xz
Fix object leak in pdf_array_put_drop() and pdf_dict_put_val_drop().
-rw-r--r--source/pdf/pdf-object.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c
index 1c19ba4f..6f481942 100644
--- a/source/pdf/pdf-object.c
+++ b/source/pdf/pdf-object.c
@@ -708,8 +708,12 @@ pdf_array_put(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item)
void
pdf_array_put_drop(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item)
{
- pdf_array_put(ctx, obj, i, item);
- pdf_drop_obj(ctx, item);
+ fz_try(ctx)
+ pdf_array_put(ctx, obj, i, item);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, item);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
void
@@ -1042,26 +1046,31 @@ pdf_dict_get_val(fz_context *ctx, pdf_obj *obj, int i)
}
void
-pdf_dict_put_val_drop(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *val)
+pdf_dict_put_val(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *val)
{
RESOLVE(obj);
if (!OBJ_IS_DICT(obj))
- {
- pdf_drop_obj(ctx, val);
fz_throw(ctx, FZ_ERROR_GENERIC, "not a dict (%s)", pdf_objkindstr(obj));
- }
+ /* FIXME: Should probably extend the dict here */
if (i < 0 || i >= DICT(obj)->len)
- {
- /* FIXME: Should probably extend the dict here */
- pdf_drop_obj(ctx, val);
fz_throw(ctx, FZ_ERROR_GENERIC, "index out of bounds");
- }
if (!val)
val = PDF_OBJ_NULL;
pdf_drop_obj(ctx, DICT(obj)->items[i].v);
- DICT(obj)->items[i].v = val;
+ DICT(obj)->items[i].v = pdf_keep_obj(ctx, val);
+}
+
+void
+pdf_dict_put_val_drop(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *val)
+{
+ fz_try(ctx)
+ pdf_dict_put_val(ctx, obj, i, val);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, val);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
/* Returns 0 <= i < len for key found. Returns -1-len < i <= -1 for key