From 9eb7d89c1609f9ebec4ab8545c95de3f8874e2da Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sun, 3 Apr 2011 22:09:06 +0200 Subject: xps: Plug memory leaks. --- fitz/res_font.c | 2 -- xps/xps_doc.c | 26 ++++++++++++++------------ xps/xps_glyphs.c | 4 +++- xps/xps_tile.c | 4 +--- xps/xps_zip.c | 12 +++++++++++- 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; } -- cgit v1.2.3