summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-10-22 17:53:32 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-10-23 18:46:01 +0200
commit7601b617a9766adc3d4b79608a6aa4febfa40529 (patch)
tree5ebf282c3ed37b5783038e9fb7fbcb4c9d27a656 /source
parent01e9e1a87216a4747d8ae3112dc79fd64ba50e85 (diff)
downloadmupdf-7601b617a9766adc3d4b79608a6aa4febfa40529.tar.xz
murun: Fix cleanup upon exeception when converting PDF array/dict to JS.
Diffstat (limited to 'source')
-rw-r--r--source/tools/murun.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/source/tools/murun.c b/source/tools/murun.c
index 0f8be8f3..881438ec 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -3002,23 +3002,26 @@ static pdf_obj *ffi_toobj(js_State *J, pdf_document *pdf, int idx)
}
if (js_isarray(J, idx)) {
- pdf_obj *val;
int i, n = js_getlength(J, idx);
+ pdf_obj *val;
fz_try(ctx)
obj = pdf_new_array(ctx, pdf, n);
fz_catch(ctx)
rethrow(J);
+ if (js_try(J)) {
+ pdf_drop_obj(ctx, obj);
+ js_throw(J);
+ }
for (i = 0; i < n; ++i) {
js_getindex(J, idx, i);
val = ffi_toobj(J, pdf, -1);
fz_try(ctx)
- pdf_array_push(ctx, obj, val);
- fz_always(ctx)
- pdf_drop_obj(ctx, val);
+ pdf_array_push_drop(ctx, obj, val);
fz_catch(ctx)
rethrow(J);
js_pop(J, 1);
}
+ js_endtry(J);
return obj;
}
@@ -3029,19 +3032,22 @@ static pdf_obj *ffi_toobj(js_State *J, pdf_document *pdf, int idx)
obj = pdf_new_dict(ctx, pdf, 0);
fz_catch(ctx)
rethrow(J);
+ if (js_try(J)) {
+ pdf_drop_obj(ctx, obj);
+ js_throw(J);
+ }
js_pushiterator(J, idx, 1);
while ((key = js_nextiterator(J, -1))) {
js_getproperty(J, idx, key);
val = ffi_toobj(J, pdf, -1);
fz_try(ctx)
- pdf_dict_puts(ctx, obj, key, val);
- fz_always(ctx)
- pdf_drop_obj(ctx, val);
+ pdf_dict_puts_drop(ctx, obj, key, val);
fz_catch(ctx)
rethrow(J);
js_pop(J, 1);
}
js_pop(J, 1);
+ js_endtry(J);
return obj;
}