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 <http://bugs.freedesktop.org/show_bug.cgi?id=23286>
---
 render/glyph.c |   42 +++++++++++++++++++++---------------------
 1 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/render/glyph.c b/render/glyph.c
index 7c044aa..6327c9f 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;
-- 
1.6.3.rc1.2.g0164.dirty
_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to