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

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Jan 1 18:21:27 PST 2013


 src/fccfg.c    |   34 ++++++++++++++++++++++++++++------
 src/fcdbg.c    |   30 +++++++++++++++++++-----------
 src/fcformat.c |    7 +++++++
 src/fcint.h    |    5 ++++-
 src/fcpat.c    |   24 ++++++++++++------------
 5 files changed, 70 insertions(+), 30 deletions(-)

New commits:
commit 8198127b2525084bfe2378b83c185fa0da7f583b
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Jan 1 20:20:31 2013 -0600

    Don't crash in FcPatternFormat() with NULL pattern

diff --git a/src/fcformat.c b/src/fcformat.c
index a8a1ad1..59f8681 100644
--- a/src/fcformat.c
+++ b/src/fcformat.c
@@ -1193,15 +1193,19 @@ FcPatternFormat (FcPattern *pat,
 {
     FcStrBuf        buf;
     FcChar8         buf_static[8192 - 1024];
+    FcPattern      *alloced = NULL;
     FcBool          ret;
 
     if (!pat)
-	return NULL;
+	alloced = pat = FcPatternCreate ();
 
     FcStrBufInit (&buf, buf_static, sizeof (buf_static));
 
     ret = FcPatternFormatToBuf (pat, format, &buf);
 
+    if (alloced)
+      FcPatternDestroy (alloced);
+
     if (ret)
 	return FcStrBufDone (&buf);
     else
commit c9581b47c4409612e8f2d4f67a402c566ba8330e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Jan 1 20:20:12 2013 -0600

    Don't crash in FcPatternDestroy with NULL pattern

diff --git a/src/fcpat.c b/src/fcpat.c
index 0aab7a0..d93eb73 100644
--- a/src/fcpat.c
+++ b/src/fcpat.c
@@ -359,6 +359,9 @@ FcPatternDestroy (FcPattern *p)
     int		    i;
     FcPatternElt    *elts;
 
+    if (!p)
+	return;
+
     if (p->ref == FC_REF_CONSTANT)
     {
 	FcCacheObjectDereference (p);
commit e7d3e2163280ffb970b60c6ed18e26325d0241e4
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Jan 1 20:10:18 2013 -0600

    Add NULL check

diff --git a/src/fcformat.c b/src/fcformat.c
index a4c72ae..a8a1ad1 100644
--- a/src/fcformat.c
+++ b/src/fcformat.c
@@ -1195,6 +1195,9 @@ FcPatternFormat (FcPattern *pat,
     FcChar8         buf_static[8192 - 1024];
     FcBool          ret;
 
+    if (!pat)
+	return NULL;
+
     FcStrBufInit (&buf, buf_static, sizeof (buf_static));
 
     ret = FcPatternFormatToBuf (pat, format, &buf);
commit 5bb5da4c4a34ca7c0a7c513e38829f69654f9962
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Jan 1 20:09:08 2013 -0600

    Refuse to set value to unsupported types during config too

diff --git a/src/fccfg.c b/src/fccfg.c
index 06f672b..ef5f4ff 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -1288,11 +1288,33 @@ static FcBool
 FcConfigAdd (FcValueListPtr *head,
 	     FcValueList    *position,
 	     FcBool	    append,
-	     FcValueList    *new)
+	     FcValueList    *new,
+	     FcObject        object)
 {
-    FcValueListPtr  *prev, last, v;
+    FcValueListPtr  *prev, l, last, v;
     FcValueBinding  sameBinding;
 
+    /*
+     * Make sure the stored type is valid for built-in objects
+     */
+    for (l = new; l != NULL; l = FcValueListNext (l))
+    {
+	if (!FcObjectValidType (object, l->value.type))
+	{
+	    fprintf (stderr,
+		     "Fontconfig warning: FcPattern object %s does not accept value", FcObjectName (object));
+	    FcValuePrintFile (stderr, l->value);
+	    fprintf (stderr, "\n");
+
+	    if (FcDebug () & FC_DBG_EDIT)
+	    {
+		printf ("Not adding\n");
+	    }
+
+	    return FcFalse;
+	}
+    }
+
     if (position)
 	sameBinding = position->binding;
     else
@@ -1387,7 +1409,7 @@ FcConfigPatternAdd (FcPattern	*p,
 
 	if (!e)
 	    return;
-	FcConfigAdd (&e->values, 0, append, list);
+	FcConfigAdd (&e->values, 0, append, list, object);
     }
 }
 
@@ -1579,7 +1601,7 @@ FcConfigSubstituteWithPat (FcConfig    *config,
 		    /*
 		     * Append the new list of values after the current value
 		     */
-		    FcConfigAdd (&st[i].elt->values, thisValue, FcTrue, l);
+		    FcConfigAdd (&st[i].elt->values, thisValue, FcTrue, l, e->object);
 		    /*
 		     * Delete the marked value
 		     */
@@ -1621,7 +1643,7 @@ FcConfigSubstituteWithPat (FcConfig    *config,
 	    case FcOpPrepend:
 		if (t)
 		{
-		    FcConfigAdd (&st[i].elt->values, st[i].value, FcFalse, l);
+		    FcConfigAdd (&st[i].elt->values, st[i].value, FcFalse, l, e->object);
 		    break;
 		}
 		/* fall through ... */
@@ -1631,7 +1653,7 @@ FcConfigSubstituteWithPat (FcConfig    *config,
 	    case FcOpAppend:
 		if (t)
 		{
-		    FcConfigAdd (&st[i].elt->values, st[i].value, FcTrue, l);
+		    FcConfigAdd (&st[i].elt->values, st[i].value, FcTrue, l, e->object);
 		    break;
 		}
 		/* fall through ... */
commit 3878a125410d1dd461aee1e40f9ac00d68be71f2
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Jan 1 19:52:14 2013 -0600

    Make FC_DBG_OBJTYPES debug messages into warnings
    
    And remove FC_DBG_OBJTYPES since it has no use now.

diff --git a/src/fcdbg.c b/src/fcdbg.c
index 20fc6c8..e8cbe32 100644
--- a/src/fcdbg.c
+++ b/src/fcdbg.c
@@ -27,44 +27,52 @@
 #include <stdlib.h>
 
 static void
-_FcValuePrint (const FcValue v)
+_FcValuePrintFile (FILE *f, const FcValue v)
 {
     switch (v.type) {
     case FcTypeVoid:
-	printf ("<void>");
+	fprintf (f, "<void>");
 	break;
     case FcTypeInteger:
-	printf ("%d(i)", v.u.i);
+	fprintf (f, "%d(i)", v.u.i);
 	break;
     case FcTypeDouble:
-	printf ("%g(f)", v.u.d);
+	fprintf (f, "%g(f)", v.u.d);
 	break;
     case FcTypeString:
-	printf ("\"%s\"", v.u.s);
+	fprintf (f, "\"%s\"", v.u.s);
 	break;
     case FcTypeBool:
-	printf ("%s", v.u.b ? "True" : "False");
+	fprintf (f, "%s", v.u.b ? "True" : "False");
 	break;
     case FcTypeMatrix:
-	printf ("[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
+	fprintf (f, "[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
 	break;
     case FcTypeCharSet:	/* XXX */
-	FcCharSetPrint (v.u.c);
+	if (f == stdout)
+	    FcCharSetPrint (v.u.c);
 	break;
     case FcTypeLangSet:
 	FcLangSetPrint (v.u.l);
 	break;
     case FcTypeFTFace:
-	printf ("face");
+	fprintf (f, "face");
 	break;
     }
 }
 
 void
+FcValuePrintFile (FILE *f, const FcValue v)
+{
+    fprintf (f, " ");
+    _FcValuePrintFile (f, v);
+}
+
+void
 FcValuePrint (const FcValue v)
 {
     printf (" ");
-    _FcValuePrint (v);
+    _FcValuePrintFile (stdout, v);
 }
 
 void
@@ -74,7 +82,7 @@ FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark)
 	printf (" [insert here] ");
     else
 	printf (" ");
-    _FcValuePrint (v);
+    _FcValuePrintFile (stdout, v);
 }
 
 static void
diff --git a/src/fcint.h b/src/fcint.h
index 68074f0..76b95ca 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -86,7 +86,6 @@ extern pfnSHGetFolderPathA pSHGetFolderPathA;
 #define FC_DBG_SCANV	256
 #define FC_DBG_CONFIG	1024
 #define FC_DBG_LANGSET	2048
-#define FC_DBG_OBJTYPES	4096
 
 #define _FC_ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1]
 #define _FC_ASSERT_STATIC0(_line, _cond) _FC_ASSERT_STATIC1 (_line, (_cond))
@@ -703,6 +702,10 @@ FcPrivate FcChar16 *
 FcCharSetGetNumbers(const FcCharSet *c);
 
 /* fcdbg.c */
+
+FcPrivate void
+FcValuePrintFile (FILE *f, const FcValue v);
+
 FcPrivate void
 FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark);
 
diff --git a/src/fcpat.c b/src/fcpat.c
index 5d94295..0aab7a0 100644
--- a/src/fcpat.c
+++ b/src/fcpat.c
@@ -553,12 +553,10 @@ FcPatternObjectListAdd (FcPattern	*p,
     {
 	if (!FcObjectValidType (object, l->value.type))
 	{
-	    if (FcDebug() & FC_DBG_OBJTYPES)
-	    {
-		printf ("FcPattern object %s does not accept value ",
-			FcObjectName (object));
-		FcValuePrint (l->value);
-	    }
+	    fprintf (stderr,
+		     "Fontconfig warning: FcPattern object %s does not accept value", FcObjectName (object));
+	    FcValuePrintFile (stderr, l->value);
+	    fprintf (stderr, "\n");
 	    goto bail0;
 	}
     }
@@ -613,12 +611,11 @@ FcPatternObjectAddWithBinding  (FcPattern	*p,
      */
     if (!FcObjectValidType (object, value.type))
     {
-	if (FcDebug() & FC_DBG_OBJTYPES)
-	{
-	    printf ("FcPattern object %s does not accept value ",
-		    FcObjectName (object));
-	    FcValuePrint (value);
-	}
+	fprintf (stderr,
+		 "Fontconfig warning: FcPattern object %s does not accept value",
+		 FcObjectName (object));
+	FcValuePrintFile (stderr, value);
+	fprintf (stderr, "\n");
 	goto bail1;
     }
 


More information about the Fontconfig mailing list