summaryrefslogtreecommitdiff
path: root/base/gsfont.c
diff options
context:
space:
mode:
authorShailesh Mistry <shailesh.mistry@hotmail.co.uk>2017-03-30 14:18:11 +0100
committerRobin Watts <robin.watts@artifex.com>2017-04-03 11:55:27 +0100
commitea5389d2ff12797df9a1fd932f499223460a3808 (patch)
treedf0c899527844cd434e28157b7334023ad98e6f5 /base/gsfont.c
parent9fbb9d8695deecfe937ffdd91b9bd69613c1c8df (diff)
downloadghostpdl-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.c19
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;
}