[Fontconfig] fontconfig: Branch 'master'

Akira TAGOH tagoh at kemper.freedesktop.org
Fri May 22 00:53:56 PDT 2015


 fontconfig/fontconfig.h |    2 +-
 src/fcinit.c            |    2 ++
 src/fcint.h             |    6 ++++++
 src/fcobjs.c            |   25 ++++++++++++++++++++++++-
 src/fcxml.c             |   47 +++++++++++++++++++++++++++++++++++++++++++----
 5 files changed, 76 insertions(+), 6 deletions(-)

New commits:
commit fa6c6b53c5a42ae6a9f8254ca9603dbe0aec63ad
Author: Akira TAGOH <akira at tagoh.org>
Date:   Fri May 22 16:53:34 2015 +0900

    Fix memory leaks after FcFini()
    
    Reported by Jia Wang
    
    https://bugs.freedesktop.org/show_bug.cgi?id=83770

diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
index 60496d9..65b85ae 100644
--- a/fontconfig/fontconfig.h
+++ b/fontconfig/fontconfig.h
@@ -217,7 +217,7 @@ typedef struct _FcMatrix {
 typedef struct _FcCharSet FcCharSet;
 
 typedef struct _FcObjectType {
-    const char	*object;
+    char	*object;
     FcType	type;
 } FcObjectType;
 
diff --git a/src/fcinit.c b/src/fcinit.c
index 0f13ec3..5e7c2f1 100644
--- a/src/fcinit.c
+++ b/src/fcinit.c
@@ -192,6 +192,8 @@ FcFini (void)
     FcConfigFini ();
     FcCacheFini ();
     FcDefaultFini ();
+    FcObjectFini ();
+    FcConfigPathFini ();
 }
 
 /*
diff --git a/src/fcint.h b/src/fcint.h
index 80205c9..83815f7 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -881,6 +881,9 @@ FcInitLoadOwnConfigAndFonts (FcConfig *config);
 
 /* fcxml.c */
 FcPrivate void
+FcConfigPathFini (void);
+
+FcPrivate void
 FcTestDestroy (FcTest *test);
 
 FcPrivate void
@@ -1192,6 +1195,9 @@ FcStrSerialize (FcSerialize *serialize, const FcChar8 *str);
 
 /* fcobjs.c */
 
+FcPrivate void
+FcObjectFini (void);
+
 FcPrivate FcObject
 FcObjectLookupIdByName (const char *str);
 
diff --git a/src/fcobjs.c b/src/fcobjs.c
index bad9824..2895dc0 100644
--- a/src/fcobjs.c
+++ b/src/fcobjs.c
@@ -44,6 +44,26 @@ struct FcObjectOtherTypeInfo {
     FcObject id;
 } *other_types;
 
+void
+FcObjectFini (void)
+{
+    struct FcObjectOtherTypeInfo *ots, *ot;
+
+retry:
+    ots = fc_atomic_ptr_get (&other_types);
+    if (!fc_atomic_ptr_cmpexch (&other_types, ots, NULL))
+	goto retry;
+
+    while (ots)
+    {
+	ot = ots->next;
+	if (ots->object.object)
+	    free (ots->object.object);
+	free (ots);
+	ots = ot;
+    }
+}
+
 static FcObjectType *
 _FcObjectLookupOtherTypeByName (const char *str, FcObject *id)
 {
@@ -62,13 +82,16 @@ retry:
 	if (!ot)
 	    return NULL;
 
-	ot->object.object = (const char *) FcStrdup (str);
+	ot->object.object = (char *) FcStrdup (str);
 	ot->object.type = FcTypeUnknown;
 	ot->id = fc_atomic_int_add (next_id, +1);
 	ot->next = ots;
 
 	if (!fc_atomic_ptr_cmpexch (&other_types, ots, ot)) {
+	    if (ot->object.object)
+		free (ot->object.object);
 	    free (ot);
+	    fc_atomic_int_add (next_id, -1);
 	    goto retry;
 	}
     }
diff --git a/src/fcxml.c b/src/fcxml.c
index 9a6f08d..1a68bc4 100644
--- a/src/fcxml.c
+++ b/src/fcxml.c
@@ -57,6 +57,9 @@
 extern FcChar8 fontconfig_instprefix[];
 #endif
 
+static FcChar8  *__fc_userdir = NULL;
+static FcChar8  *__fc_userconf = NULL;
+
 static void
 FcExprDestroy (FcExpr *e);
 
@@ -2262,6 +2265,24 @@ FcParseCacheDir (FcConfigParse *parse)
 	FcStrFree (data);
 }
 
+void
+FcConfigPathFini (void)
+{
+    FcChar8 *s;
+
+retry_dir:
+    s = fc_atomic_ptr_get (&__fc_userdir);
+    if (!fc_atomic_ptr_cmpexch (&__fc_userdir, s, NULL))
+	goto retry_dir;
+    free (s);
+
+retry_conf:
+    s = fc_atomic_ptr_get (&__fc_userconf);
+    if (!fc_atomic_ptr_cmpexch (&__fc_userconf, s, NULL))
+	goto retry_conf;
+    free (s);
+}
+
 static void
 FcParseInclude (FcConfigParse *parse)
 {
@@ -2272,8 +2293,7 @@ FcParseInclude (FcConfigParse *parse)
     FcBool	    deprecated = FcFalse;
 #endif
     FcChar8	    *prefix = NULL, *p;
-    static FcChar8  *userdir = NULL;
-    static FcChar8  *userconf = NULL;
+    FcChar8	    userdir, userconf;
 
     s = FcStrBufDoneStatic (&parse->pstack->str);
     if (!s)
@@ -2303,6 +2323,7 @@ FcParseInclude (FcConfigParse *parse)
     {
 	size_t plen = strlen ((const char *)prefix);
 	size_t dlen = strlen ((const char *)s);
+	FcChar8 *u;
 
 	p = realloc (prefix, plen + 1 + dlen + 1);
 	if (!p)
@@ -2318,14 +2339,32 @@ FcParseInclude (FcConfigParse *parse)
 	if (FcFileIsDir (s))
 	{
 	userdir:
+	    userdir = fc_atomic_ptr_get (&__fc_userdir);
 	    if (!userdir)
-		userdir = FcStrdup (s);
+	    {
+		u = FcStrdup (s);
+		if (!fc_atomic_ptr_cmpexch (&__fc_userdir, userdir, u))
+		{
+		    free (u);
+		    goto userdir;
+		}
+		userdir = u;
+	    }
 	}
 	else if (FcFileIsFile (s))
 	{
 	userconf:
+	    userconf = fc_atomic_ptr_get (&__fc_userconf);
 	    if (!userconf)
-		userconf = FcStrdup (s);
+	    {
+		u = FcStrdup (s);
+		if (!fc_atomic_ptr_cmpexch (&__fc_userconf, userconf, u))
+		{
+		    free (u);
+		    goto userconf;
+		}
+		userconf = u;
+	    }
 	}
 	else
 	{


More information about the Fontconfig mailing list