[Fontconfig] fontconfig: Branch ''master''

Akira TAGOH
2012-02-21T06:30:44Z

fc-match/fc-match.c |    5 +++++
 src/fcmatch.c       |   29 ++++++++++++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

New commits:
commit a18ca17b6211f62fbd1d893811b94b8c83db4cc0
Author: Akira TAGOH <akira at tagoh.org>
Date:   Tue Feb 21 15:29:56 2012 +0900

    Bug 40452 - Running ''fc-match --all'' core dumps when no
fonts are installed

    This would changes the behavior of FcFontSort().
    it won''t returns NULL afterward.

diff --git a/fc-match/fc-match.c b/fc-match/fc-match.c
index e64b4bc..095dd4e 100644
--- a/fc-match/fc-match.c
+++ b/fc-match/fc-match.c
@@ -175,6 +175,11 @@ main (int argc, char **argv)
 	int	j;
 	font_patterns = FcFontSort (0, pat, all ? FcFalse : FcTrue, 0, &result);

+	if (!font_patterns || font_patterns->nfont == 0)
+	{
+	    fputs("No fonts installed on the system\n", stderr);
+	    return 1;
+	}
 	for (j = 0; j < font_patterns->nfont; j++)
 	{
 	    FcPattern  *font_pattern;
diff --git a/src/fcmatch.c b/src/fcmatch.c
index 1b9162b..422bc38 100644
--- a/src/fcmatch.c
+++ b/src/fcmatch.c
@@ -23,6 +23,7 @@
  */

 #include "fcint.h"
+#include <assert.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdio.h>
@@ -395,6 +396,9 @@ FcFontRenderPrepare (FcConfig	    *config,
     FcValue	    v;
     FcResult	    result;

+    assert (pat != NULL);
+    assert (font != NULL);
+
     new = FcPatternCreate ();
     if (!new)
 	return 0;
@@ -514,6 +518,10 @@ FcFontSetMatch (FcConfig    *config,
 {
     FcPattern	    *best;

+    assert (sets != NULL);
+    assert (p != NULL);
+    assert (result != NULL);
+
     if (!config)
     {
 	config = FcConfigGetCurrent ();
@@ -536,6 +544,9 @@ FcFontMatch (FcConfig	*config,
     int		nsets;
     FcPattern   *best;

+    assert (p != NULL);
+    assert (result != NULL);
+
     if (!config)
     {
 	config = FcConfigGetCurrent ();
@@ -672,6 +683,19 @@ FcFontSetSort (FcConfig	    *config,
     FcBool    	    *patternLangSat;
     FcValue	    patternLang;

+    assert (sets != NULL);
+    assert (p != NULL);
+    assert (result != NULL);
+
+    /* There are some implementation that relying on the result of
+     * "result" to check if the return value of FcFontSetSort
+     * is valid or not.
+     * So we should initialize it to the conservative way since
+     * this function doesn''t return NULL anymore.
+     */
+    if (result)
+	*result = FcResultNoMatch;
+
     if (FcDebug () & FC_DBG_MATCH)
     {
 	printf ("Sort ");
@@ -686,7 +710,7 @@ FcFontSetSort (FcConfig	    *config,
 	nnodes += s->nfont;
     }
     if (!nnodes)
-	goto bail0;
+	return FcFontSetCreate ();

     for (nPatternLang = 0;
 	 FcPatternGet (p, FC_LANG, nPatternLang, &patternLang) == FcResultMatch;
@@ -822,6 +846,9 @@ FcFontSort (FcConfig	*config,
     FcFontSet	*sets[2];
     int		nsets;

+    assert (p != NULL);
+    assert (result != NULL);
+
     if (!config)
     {
 	config = FcConfigGetCurrent ();