summaryrefslogtreecommitdiff
path: root/xps
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-11-29 11:55:34 +0000
committerRobin Watts <robin.watts@artifex.com>2012-11-29 11:57:11 +0000
commitc3fa0d45ff96eefe6effaeffc45516c6f85587bd (patch)
tree5f6b8682571b9a76ffde02895ce1b7fc109d9c95 /xps
parent94b2a364223143dc7f749862c6983173d8b47a66 (diff)
downloadmupdf-c3fa0d45ff96eefe6effaeffc45516c6f85587bd.tar.xz
Bug 693463: Fix various memory leaks.
All these leaks were spotted by zeniko, so credit/thanks to him.
Diffstat (limited to 'xps')
-rw-r--r--xps/xps_doc.c32
-rw-r--r--xps/xps_resource.c15
2 files changed, 41 insertions, 6 deletions
diff --git a/xps/xps_doc.c b/xps/xps_doc.c
index 8c86fd59..4fefceb3 100644
--- a/xps/xps_doc.c
+++ b/xps/xps_doc.c
@@ -366,12 +366,25 @@ xps_parse_metadata(xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
static void
xps_read_and_process_metadata_part(xps_document *doc, char *name, xps_fixdoc *fixdoc)
{
- if (xps_has_part(doc, name))
+ fz_context *ctx = doc->ctx;
+ xps_part *part;
+
+ if (!xps_has_part(doc, name))
+ return;
+
+ part = xps_read_part(doc, name);
+ fz_try(ctx)
{
- xps_part *part = xps_read_part(doc, name);
xps_parse_metadata(doc, part, fixdoc);
+ }
+ fz_always(ctx)
+ {
xps_free_part(doc, part);
}
+ fz_catch(ctx)
+ {
+ fz_rethrow(ctx);
+ }
}
void
@@ -415,10 +428,21 @@ xps_load_fixed_page(xps_document *doc, xps_page *page)
fz_xml *root;
char *width_att;
char *height_att;
+ fz_context *ctx = doc->ctx;
part = xps_read_part(doc, page->name);
- root = fz_parse_xml(doc->ctx, part->data, part->size);
- xps_free_part(doc, part);
+ fz_try(ctx)
+ {
+ root = fz_parse_xml(doc->ctx, part->data, part->size);
+ }
+ fz_always(ctx)
+ {
+ xps_free_part(doc, part);
+ }
+ fz_catch(ctx)
+ {
+ root = NULL;
+ }
if (!root)
fz_throw(doc->ctx, "FixedPage missing root element");
diff --git a/xps/xps_resource.c b/xps/xps_resource.c
index ffbce2d3..b94b6d3e 100644
--- a/xps/xps_resource.c
+++ b/xps/xps_resource.c
@@ -60,12 +60,23 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
xps_part *part;
fz_xml *xml;
char *s;
+ fz_context *ctx = doc->ctx;
/* External resource dictionaries MUST NOT reference other resource dictionaries */
xps_resolve_url(part_name, base_uri, source_att, sizeof part_name);
part = xps_read_part(doc, part_name);
- xml = fz_parse_xml(doc->ctx, part->data, part->size);
- xps_free_part(doc, part);
+ fz_try(ctx)
+ {
+ xml = fz_parse_xml(doc->ctx, part->data, part->size);
+ }
+ fz_always(ctx)
+ {
+ xps_free_part(doc, part);
+ }
+ fz_catch(ctx)
+ {
+ xml = NULL;
+ }
if (!xml)
return NULL;