From 6a0c91e750cdab83a63f0ef03ea037b1e6d8d381 Mon Sep 17 00:00:00 2001 From: Dima Kogan Date: Tue, 29 Sep 2015 02:19:35 -0700 Subject: [PATCH] compact_font_cache_entry() now properly checks for marked fonts * src/alloc.c (compact_font_cache_entry): When checking for marked fonts we were looking at a font entity object. However the entity could contain a list of font objects that need to be checked, which we now do. This resolves a memory leak Fixes: bug#21556 --- src/alloc.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 3ab2a6e..2cdc581 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -5303,10 +5303,31 @@ compact_font_cache_entry (Lisp_Object entry) are not marked too. But we must be sure that nothing is marked within OBJ before we really drop it. */ for (i = 0; i < size; i++) - if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i)))) - break; + { + Lisp_Object objlist; + + if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i)))) + break; + + objlist = AREF (AREF (XCDR (obj), i), FONT_OBJLIST_INDEX); + for (; CONSP (objlist); objlist = XCDR (objlist)) + { + Lisp_Object val = XCAR (objlist); + struct font *font = XFONT_OBJECT (val); + + if (! NILP (AREF (val, FONT_TYPE_INDEX)) && + VECTOR_MARKED_P(font)) + break; + } + if (CONSP (objlist)) + // we left the for() early because we found marked + // font + break; + } if (i == size) + // we didn't leave the for() early because no marked fonts + // or entities were found. drop = 1; } if (drop) -- 2.1.4