summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2011-04-03 22:09:06 +0200
committerTor Andersson <tor.andersson@artifex.com>2011-04-03 22:09:06 +0200
commit9eb7d89c1609f9ebec4ab8545c95de3f8874e2da (patch)
treea22983e0ba7f1c811408b44a45a329f6ee622e0f
parent5ea6c5701e7ec3f738a8adb6d20790edcda781ba (diff)
downloadmupdf-9eb7d89c1609f9ebec4ab8545c95de3f8874e2da.tar.xz
xps: Plug memory leaks.
-rw-r--r--fitz/res_font.c2
-rw-r--r--xps/xps_doc.c26
-rw-r--r--xps/xps_glyphs.c4
-rw-r--r--xps/xps_tile.c4
-rw-r--r--xps/xps_zip.c12
5 files changed, 29 insertions, 19 deletions
diff --git a/fitz/res_font.c b/fitz/res_font.c
index 44046451..f076a9e9 100644
--- a/fitz/res_font.c
+++ b/fitz/res_font.c
@@ -212,8 +212,6 @@ fz_newfontfrombuffer(fz_font **fontp, unsigned char *data, int len, int index)
if (error)
return fz_rethrow(error, "cannot init freetype library");
- font = fz_newfont();
-
fterr = FT_New_Memory_Face(fz_ftlib, data, len, index, &face);
if (fterr)
return fz_throw("freetype: cannot load font: %s", ft_errorstring(fterr));
diff --git a/xps/xps_doc.c b/xps/xps_doc.c
index c9a4eec5..d600aafb 100644
--- a/xps/xps_doc.c
+++ b/xps/xps_doc.c
@@ -86,13 +86,14 @@ xps_add_fixed_page(xps_context *ctx, char *name, int width, int height)
static void
xps_free_fixed_pages(xps_context *ctx)
{
- xps_page *node = ctx->first_page;
- while (node)
+ xps_page *page = ctx->first_page;
+ while (page)
{
- xps_page *next = node->next;
- fz_free(node->name);
- fz_free(node);
- node = next;
+ xps_page *next = page->next;
+ xps_free_page(ctx, page);
+ fz_free(page->name);
+ fz_free(page);
+ page = next;
}
ctx->first_page = NULL;
ctx->last_page = NULL;
@@ -101,13 +102,13 @@ xps_free_fixed_pages(xps_context *ctx)
static void
xps_free_fixed_documents(xps_context *ctx)
{
- xps_document *node = ctx->first_fixdoc;
- while (node)
+ xps_document *doc = ctx->first_fixdoc;
+ while (doc)
{
- xps_document *next = node->next;
- fz_free(node->name);
- fz_free(node);
- node = next;
+ xps_document *next = doc->next;
+ fz_free(doc->name);
+ fz_free(doc);
+ doc = next;
}
ctx->first_fixdoc = NULL;
ctx->last_fixdoc = NULL;
@@ -333,6 +334,7 @@ xps_load_page(xps_context *ctx, int number)
void
xps_free_page(xps_context *ctx, xps_page *page)
{
+ /* only free the XML contents */
if (page->root)
xml_free_element(page->root);
page->root = NULL;
diff --git a/xps/xps_glyphs.c b/xps/xps_glyphs.c
index 9d0d9fca..06438598 100644
--- a/xps/xps_glyphs.c
+++ b/xps/xps_glyphs.c
@@ -483,7 +483,9 @@ xps_parse_glyphs(xps_context *ctx, fz_matrix ctm,
xps_hash_insert(ctx->font_table, part->name, font);
- /* NOTE: we kept part->name in the hashtable and part->data in the font */
+ /* NOTE: we keep part->name in the hashtable and part->data in the font */
+ font->ftdata = part->data;
+ font->ftsize = part->size;
fz_free(part);
}
diff --git a/xps/xps_tile.c b/xps/xps_tile.c
index 59dd181b..1d87bdb3 100644
--- a/xps/xps_tile.c
+++ b/xps/xps_tile.c
@@ -26,11 +26,9 @@ xps_paint_tiling_brush_clipped(xps_context *ctx, fz_matrix ctm, fz_rect viewbox,
fz_lineto(path, viewbox.x1, viewbox.y1);
fz_lineto(path, viewbox.x1, viewbox.y0);
fz_closepath(path);
-
ctx->dev->clippath(ctx->dev->user, path, 0, ctm);
-
+ fz_freepath(path);
c->func(ctx, ctm, viewbox, c->base_uri, c->dict, c->root, c->user);
-
ctx->dev->popclip(ctx->dev->user);
}
diff --git a/xps/xps_zip.c b/xps/xps_zip.c
index d353ec11..abb78832 100644
--- a/xps/xps_zip.c
+++ b/xps/xps_zip.c
@@ -451,6 +451,11 @@ static void xps_free_font_func(void *ptr)
fz_dropfont(ptr);
}
+static void xps_free_colorspace_func(void *ptr)
+{
+ fz_dropcolorspace(ptr);
+}
+
int
xps_free_context(xps_context *ctx)
{
@@ -459,14 +464,19 @@ xps_free_context(xps_context *ctx)
if (ctx->file)
fclose(ctx->file);
+ if (ctx->start_part)
+ fz_free(ctx->start_part);
+
for (i = 0; i < ctx->zip_count; i++)
fz_free(ctx->zip_table[i].name);
fz_free(ctx->zip_table);
xps_hash_free(ctx->font_table, xps_free_key_func, xps_free_font_func);
- xps_hash_free(ctx->colorspace_table, xps_free_key_func, NULL);
+ xps_hash_free(ctx->colorspace_table, xps_free_key_func, xps_free_colorspace_func);
xps_free_page_list(ctx);
+ fz_free(ctx);
+
return 0;
}