From f772014c435f56db56520ca13ffa39431684f122 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 23 Sep 2009 10:53:51 +1000 Subject: render: Plug a memory leak in AddGlyph. (#23286) AddGlyph was missing the FreePicture() call that DeleteGlyph used, resulting in a memory leak when more than one Glyph was added in a RenderAddGlyphs request. Since the code in AddGlyph and DeleteGlyph is identical, move into a static function to avoid such mistakes in the future. X.Org Bug 23286 --- render/glyph.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/render/glyph.c b/render/glyph.c index 7c044aada..6327c9fda 100644 --- a/render/glyph.c +++ b/render/glyph.c @@ -272,13 +272,31 @@ CheckDuplicates (GlyphHashPtr hash, char *where) #define DuplicateRef(a,b) #endif +static void +FreeGlyphPicture(GlyphPtr glyph) +{ + PictureScreenPtr ps; + int i; + + for (i = 0; i < screenInfo.numScreens; i++) + { + ScreenPtr pScreen = screenInfo.screens[i]; + + FreePicture ((pointer) GlyphPicture (glyph)[i], 0); + + ps = GetPictureScreenIfSet (pScreen); + if (ps) + (*ps->UnrealizeGlyph) (pScreen, glyph); + } +} + + void FreeGlyph (GlyphPtr glyph, int format) { CheckDuplicates (&globalGlyphs[format], "FreeGlyph"); if (--glyph->refcnt == 0) { - PictureScreenPtr ps; GlyphRefPtr gr; int i; int first; @@ -305,17 +323,7 @@ FreeGlyph (GlyphPtr glyph, int format) globalGlyphs[format].tableEntries--; } - for (i = 0; i < screenInfo.numScreens; i++) - { - ScreenPtr pScreen = screenInfo.screens[i]; - - FreePicture ((pointer) GlyphPicture (glyph)[i], 0); - - ps = GetPictureScreenIfSet (pScreen); - if (ps) - (*ps->UnrealizeGlyph) (pScreen, glyph); - } - + FreeGlyphPicture(glyph); FreeGlyphPrivates(glyph); xfree (glyph); } @@ -334,15 +342,7 @@ AddGlyph (GlyphSetPtr glyphSet, GlyphPtr glyph, Glyph id) TRUE, glyph->sha1); if (gr->glyph && gr->glyph != DeletedGlyph && gr->glyph != glyph) { - PictureScreenPtr ps; - int i; - - for (i = 0; i < screenInfo.numScreens; i++) - { - ps = GetPictureScreenIfSet (screenInfo.screens[i]); - if (ps) - (*ps->UnrealizeGlyph) (screenInfo.screens[i], glyph); - } + FreeGlyphPicture(glyph); FreeGlyphPrivates(glyph); xfree (glyph); glyph = gr->glyph; -- cgit v1.2.3