summaryrefslogtreecommitdiff
path: root/pdf
diff options
context:
space:
mode:
authorPaul Gardiner <paul@glidos.net>2012-04-20 13:02:40 +0100
committerPaul Gardiner <paul@glidos.net>2012-05-08 15:13:31 +0100
commit0bf5788dffe18ffbe38cd96f4e878d37bfb333ce (patch)
treea6fa6d0de9d641c809a9951daaaf19ffab644797 /pdf
parent717f8dc44ac6e13db6f4ced9ddfc364a7504d5de (diff)
downloadmupdf-0bf5788dffe18ffbe38cd96f4e878d37bfb333ce.tar.xz
Free javascript types and objects correctly
Diffstat (limited to 'pdf')
-rw-r--r--pdf/mupdf-internal.h2
-rw-r--r--pdf/pdf_js.c3
-rw-r--r--pdf/pdf_jsimp.c138
3 files changed, 106 insertions, 37 deletions
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h
index 8ffb81f1..3c233f34 100644
--- a/pdf/mupdf-internal.h
+++ b/pdf/mupdf-internal.h
@@ -590,10 +590,12 @@ pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx);
void pdf_drop_jsimp(pdf_jsimp *imp);
pdf_jsimp_type *pdf_jsimp_new_type(pdf_jsimp *imp, pdf_jsimp_dtr *dtr);
+void pdf_jsimp_drop_type(pdf_jsimp *imp, pdf_jsimp_type *type);
void pdf_jsimp_addmethod(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_method *meth);
void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_getter *get, pdf_jsimp_setter *set);
pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *obj);
+void pdf_jsimp_drop_obj(pdf_jsimp *imp, pdf_jsimp_obj *obj);
void pdf_jsimp_set_this(pdf_jsimp *imp, pdf_jsimp_obj *obj);
diff --git a/pdf/pdf_js.c b/pdf/pdf_js.c
index 408f7bf2..10e2b66e 100644
--- a/pdf/pdf_js.c
+++ b/pdf/pdf_js.c
@@ -108,6 +108,9 @@ void pdf_drop_js(pdf_js *js)
if (js)
{
fz_context *ctx = js->doc->ctx;
+ pdf_jsimp_drop_obj(js->imp, js->jsdoc);
+ pdf_jsimp_drop_type(js->imp, js->fieldtype);
+ pdf_jsimp_drop_type(js->imp, js->doctype);
pdf_drop_jsimp(js->imp);
fz_free(ctx, js);
}
diff --git a/pdf/pdf_jsimp.c b/pdf/pdf_jsimp.c
index c0a11c58..aef7b53a 100644
--- a/pdf/pdf_jsimp.c
+++ b/pdf/pdf_jsimp.c
@@ -65,58 +65,90 @@ static double digit_button(pdf_jsimp *imp, int digit)
static void assign_display_value(pdf_jsimp *imp, double val)
{
+ fz_context *ctx = imp->ctx;
char valstr[256];
- pdf_jsimp_obj *valobj;
+ pdf_jsimp_obj *valobj = NULL;
+ pdf_jsimp_obj *strarg = NULL;
- if (imp->display == NULL)
+ fz_var(valobj);
+ fz_var(strarg);
+ fz_try(ctx)
{
- pdf_jsimp_obj *str_arg = pdf_jsimp_fromString(imp, "Display");
- pdf_jsimp_obj *doc = imp->jsthis;
- imp->display = doc->type->getField(imp->jsctx, doc->obj, 1, &str_arg);
- }
+ if (imp->display == NULL)
+ {
+ pdf_jsimp_obj *doc = imp->jsthis;
+ strarg = pdf_jsimp_fromString(imp, "Display");
+ imp->display = doc->type->getField(imp->jsctx, doc->obj, 1, &strarg);
+ }
- snprintf(valstr, sizeof(valstr), "%f", val);
- if (imp->display && imp->display->type->setValue)
+ snprintf(valstr, sizeof(valstr), "%f", val);
+ if (imp->display && imp->display->type->setValue)
+ {
+ valobj = pdf_jsimp_fromString(imp, valstr);
+ imp->display->type->setValue(imp->jsctx, imp->display->obj, valobj);
+ }
+ }
+ fz_always(ctx)
+ {
+ pdf_jsimp_drop_obj(imp, strarg);
+ pdf_jsimp_drop_obj(imp, valobj);
+ }
+ fz_catch(ctx)
{
- valobj = pdf_jsimp_fromString(imp, valstr);
- imp->display->type->setValue(imp->jsctx, imp->display->obj, valobj);
+ fz_rethrow(ctx);
}
}
static void assign_func_value(pdf_jsimp *imp, int val)
{
+ fz_context *ctx = imp->ctx;
pdf_jsimp_obj *valobj = NULL;
+ pdf_jsimp_obj *strarg = NULL;
- if (imp->funcfield == NULL)
+ fz_var(valobj);
+ fz_var(strarg);
+ fz_try(ctx)
{
- pdf_jsimp_obj *str_arg = pdf_jsimp_fromString(imp, "Func");
- pdf_jsimp_obj *doc = imp->jsthis;
- imp->funcfield = doc->type->getField(imp->jsctx, doc->obj, 1, &str_arg);
- }
-
- if (imp->funcfield && imp->funcfield->type->setValue)
- {
- switch(val)
+ if (imp->funcfield == NULL)
{
- case FUNC_NONE:
- valobj = pdf_jsimp_fromString(imp, "");
- break;
- case FUNC_MULT:
- valobj = pdf_jsimp_fromString(imp, "MULT");
- break;
- case FUNC_DIV:
- valobj = pdf_jsimp_fromString(imp, "DIV");
- break;
- case FUNC_PLUS:
- valobj = pdf_jsimp_fromString(imp, "PLUS");
- break;
- case FUNC_MINUS:
- valobj = pdf_jsimp_fromString(imp, "MINUS");
- break;
+ pdf_jsimp_obj *strarg = pdf_jsimp_fromString(imp, "Func");
+ pdf_jsimp_obj *doc = imp->jsthis;
+ imp->funcfield = doc->type->getField(imp->jsctx, doc->obj, 1, &strarg);
}
- if (valobj)
- imp->funcfield->type->setValue(imp->jsctx, imp->funcfield->obj, valobj);
+ if (imp->funcfield && imp->funcfield->type->setValue)
+ {
+ switch(val)
+ {
+ case FUNC_NONE:
+ valobj = pdf_jsimp_fromString(imp, "");
+ break;
+ case FUNC_MULT:
+ valobj = pdf_jsimp_fromString(imp, "MULT");
+ break;
+ case FUNC_DIV:
+ valobj = pdf_jsimp_fromString(imp, "DIV");
+ break;
+ case FUNC_PLUS:
+ valobj = pdf_jsimp_fromString(imp, "PLUS");
+ break;
+ case FUNC_MINUS:
+ valobj = pdf_jsimp_fromString(imp, "MINUS");
+ break;
+ }
+
+ if (valobj)
+ imp->funcfield->type->setValue(imp->jsctx, imp->funcfield->obj, valobj);
+ }
+ }
+ fz_always(ctx)
+ {
+ pdf_jsimp_drop_obj(imp, strarg);
+ pdf_jsimp_drop_obj(imp, valobj);
+ }
+ fz_catch(ctx)
+ {
+ fz_rethrow(ctx);
}
}
@@ -206,6 +238,11 @@ pdf_jsimp_type *pdf_jsimp_new_type(pdf_jsimp *imp, pdf_jsimp_dtr *dtr)
return type;
}
+void pdf_jsimp_drop_type(pdf_jsimp *imp, pdf_jsimp_type *type)
+{
+ fz_free(imp->ctx, type);
+}
+
void pdf_jsimp_addmethod(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_method *meth)
{
if (!strcmp(name, "getField"))
@@ -232,6 +269,25 @@ pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *nat
return obj;
}
+void pdf_jsimp_drop_obj(pdf_jsimp *imp, pdf_jsimp_obj *obj)
+{
+ if (obj)
+ {
+ if (obj->type)
+ {
+ if (obj->type->dtr)
+ obj->type->dtr(imp->jsctx, obj->obj);
+ }
+ else
+ {
+ /* It's a string */
+ fz_free(imp->ctx, obj->obj);
+ }
+
+ fz_free(imp->ctx, obj);
+ }
+}
+
void pdf_jsimp_set_this(pdf_jsimp *imp, pdf_jsimp_obj *obj)
{
imp->jsthis = obj;
@@ -242,7 +298,15 @@ pdf_jsimp_obj *pdf_jsimp_fromString(pdf_jsimp *imp, char *str)
{
/* Represent a string object as a pdf_jsimp_obj with a NULL type */
pdf_jsimp_obj *obj = fz_malloc_struct(imp->ctx, pdf_jsimp_obj);
- obj->obj = fz_strdup(imp->ctx, str);
+ fz_try(imp->ctx)
+ {
+ obj->obj = fz_strdup(imp->ctx, str);
+ }
+ fz_catch(imp->ctx)
+ {
+ pdf_jsimp_drop_obj(imp, obj);
+ fz_rethrow(imp->ctx);
+ }
return obj;
}