From b7e8af4ce9f3352631c0e1efaee9b92f9bc43bb3 Mon Sep 17 00:00:00 2001 From: Chris Liddell <chris.liddell@artifex.com> Date: Wed, 10 Oct 2018 15:48:33 +0100 Subject: [PATCH] Fix a memory leak with subclassed devices (stype) A dynamic stype in a subclass device wasn't being free with the device - likely an oversight from adding the subclass device specific finalize method (rather than using the generic device finalize). If a subclassed device has a 'dynamic' stype, --- base/gdevsclass.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/base/gdevsclass.c b/base/gdevsclass.c index 0f26774..8b2642e 100644 --- a/base/gdevsclass.c +++ b/base/gdevsclass.c @@ -901,6 +901,11 @@ void default_subclass_finalize(const gs_memory_t *cmem, void *vptr) generic_subclass_data *psubclass_data = (generic_subclass_data *)dev->subclass_data; (void)cmem; /* unused */ + if (dev->finalize) + dev->finalize(dev); + + discard(gs_closedevice(dev)); + if (psubclass_data) { gs_free_object(dev->memory->non_gc_memory, psubclass_data, "gx_epo_finalize(suclass data)"); dev->subclass_data = NULL; @@ -908,6 +913,9 @@ void default_subclass_finalize(const gs_memory_t *cmem, void *vptr) if (dev->child) { gs_free_object(dev->memory->stable_memory, dev->child, "free child device memory for subclassing device"); } + if (dev->stype_is_dynamic) + gs_free_const_object(dev->memory->non_gc_memory, dev->stype, + "default_subclass_finalize"); if (dev->parent) dev->parent->child = dev->child; if (dev->child) -- 2.9.1