diff options
author | Shailesh Mistry <shailesh.mistry@hotmail.co.uk> | 2017-03-30 14:18:11 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2017-04-03 11:55:27 +0100 |
commit | ea5389d2ff12797df9a1fd932f499223460a3808 (patch) | |
tree | df0c899527844cd434e28157b7334023ad98e6f5 /base/gsfont.c | |
parent | 9fbb9d8695deecfe937ffdd91b9bd69613c1c8df (diff) | |
download | ghostpdl-ea5389d2ff12797df9a1fd932f499223460a3808.tar.gz |
Bug 697545: Memory Squeezing fix font cache leak.
Fix font cache leak when memory squeezing:
gs -sDEVICE=bit -o /dev/null: examples/tiger.eps
Diffstat (limited to 'base/gsfont.c')
-rw-r--r-- | base/gsfont.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/base/gsfont.c b/base/gsfont.c index 2c69aa89f..b1927b59e 100644 --- a/base/gsfont.c +++ b/base/gsfont.c @@ -278,9 +278,28 @@ static void gs_font_dir_finalize(const gs_memory_t *cmem, void *vptr) { gs_font_dir *pdir = vptr; + gx_bits_cache_chunk *chunk = pdir->ccache.chunks; + gx_bits_cache_chunk *start_chunk = chunk; + gx_bits_cache_chunk *prev_chunk; + if (pdir == cmem->gs_lib_ctx->font_dir) { cmem->gs_lib_ctx->font_dir = NULL; } + + /* free the circular list of memory chunks */ + while (chunk) { + if (start_chunk == chunk->next) { + gs_free_object(pdir->ccache.bits_memory, chunk->data, "gs_font_dir_finalize"); + gs_free_object(pdir->ccache.bits_memory, chunk, "gs_font_dir_finalize"); + break; + } + + prev_chunk = chunk; + chunk = chunk->next; + gs_free_object(pdir->ccache.bits_memory, prev_chunk->data, "gs_font_dir_finalize"); + gs_free_object(pdir->ccache.bits_memory, prev_chunk, "gs_font_dir_finalize"); + } + pdir->ccache.chunks = NULL; } |