[Fontconfig] fontconfig: Branch 'master' - 2 commits

Akira TAGOH tagoh at kemper.freedesktop.org
Fri Aug 23 21:47:16 PDT 2013


 src/fccfg.c |   28 +++++++++++-----------------
 src/fcint.h |    5 +++--
 src/fcxml.c |    7 ++++---
 3 files changed, 18 insertions(+), 22 deletions(-)

New commits:
commit 223c1384c98caaf9ba5d2cddf7465b7b3a82316b
Author: Akira TAGOH <akira at tagoh.org>
Date:   Fri Aug 23 20:42:37 2013 +0900

    Fix a crash when non-builtin objects are edited

diff --git a/src/fccfg.c b/src/fccfg.c
index be738d5..d399f7f 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -649,8 +649,10 @@ FcConfigAddRule (FcConfig	*config,
 {
     FcSubst	*subst, **prev;
     FcRule	*r;
-    int		num;
+    int		n = 0;
 
+    if (!rule)
+	return FcFalse;
     switch (kind) {
     case FcMatchPattern:
 	prev = &config->substPattern;
@@ -671,7 +673,6 @@ FcConfigAddRule (FcConfig	*config,
     *prev = subst;
     subst->next = NULL;
     subst->rule = rule;
-    num = 0;
     for (r = rule; r; r = r->next)
     {
 	switch (r->type)
@@ -680,19 +681,21 @@ FcConfigAddRule (FcConfig	*config,
 	    if (r->u.test &&
 		r->u.test->kind == FcMatchDefault)
 		r->u.test->kind = kind;
-	    if (r->u.test->object > FC_MAX_BASE_OBJECT)
-		num++;
+
+	    if (n < r->u.test->object)
+		n = r->u.test->object;
 	    break;
 	case FcRuleEdit:
-	    if (r->u.edit->object > FC_MAX_BASE_OBJECT)
-		num++;
+	    if (n < r->u.edit->object)
+		n = r->u.edit->object;
 	    break;
 	default:
 	    break;
 	}
     }
-    if (config->maxObjects < num)
-	config->maxObjects = num;
+    n = FC_OBJ_ID (n) - FC_MAX_BASE_OBJECT;
+    if (config->maxObjects < n)
+	config->maxObjects = n;
     if (FcDebug () & FC_DBG_EDIT)
     {
 	printf ("Add Subst ");
@@ -701,11 +704,6 @@ FcConfigAddRule (FcConfig	*config,
     return FcTrue;
 }
 
-typedef struct _FcSubState {
-    FcPatternElt   *elt;
-    FcValueList    *value;
-} FcSubState;
-
 static FcValue
 FcConfigPromote (FcValue v, FcValue u, FcValuePromotionBuffer *buf)
 {
@@ -1503,8 +1501,6 @@ FcConfigSubstituteWithPat (FcConfig    *config,
     int		    i, nobjs;
     FcBool	    retval = FcTrue;
 
-#define FC_OBJ_ID(_n_)	((_n_) > FC_MAX_BASE_OBJECT ? ((_n_) - FC_EXT_OBJ_INDEX) : (_n_))
-
     if (!config)
     {
 	config = FcConfigGetCurrent ();
@@ -1745,8 +1741,6 @@ bail1:
     if (value)
 	free (value);
 
-#undef FC_OBJ_ID
-
     return retval;
 }
 
diff --git a/src/fcint.h b/src/fcint.h
index ec0c674..362ea6f 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -174,10 +174,11 @@ typedef struct _FcValueList {
 			
 typedef int FcObject;
 
-/* The 1000 is to leave some room for future added internal objects, such
+/* The 1024 is to leave some room for future added internal objects, such
  * that caches from newer fontconfig can still be used with older fontconfig
  * without getting confused. */
-#define FC_EXT_OBJ_INDEX	1000
+#define FC_EXT_OBJ_INDEX	1024
+#define FC_OBJ_ID(_n_)	((_n_) & (~FC_EXT_OBJ_INDEX))
 
 typedef struct _FcPatternElt *FcPatternEltPtr;
 
commit 6c664d533d242112c30e0d3b585e90a361a1b959
Author: Akira TAGOH <akira at tagoh.org>
Date:   Fri Aug 23 19:58:43 2013 +0900

    Fix a typo

diff --git a/src/fcxml.c b/src/fcxml.c
index 2cdf0ad..b464b4e 100644
--- a/src/fcxml.c
+++ b/src/fcxml.c
@@ -2509,7 +2509,6 @@ FcParseMatch (FcConfigParse *parse)
 {
     const FcChar8   *kind_name;
     FcMatchKind	    kind;
-    FcEdit	    *edit = 0;
     FcVStack	    *vstack;
     FcRule	    *rule = NULL, *r;
 
@@ -2545,8 +2544,10 @@ FcParseMatch (FcConfigParse *parse)
 	    {
 		FcConfigMessage (parse, FcSevereError,
 				 "<match target=\"scan\"> cannot edit user-defined object \"%s\"",
-				 FcObjectName(edit->object));
-		break;
+				 FcObjectName(vstack->u.edit->object));
+		if (rule)
+		    FcRuleDestroy (rule);
+		return;
 	    }
 	    r = FcRuleCreate (FcRuleEdit, vstack->u.edit);
 	    if (rule)


More information about the Fontconfig mailing list