]> git.wh0rd.org Git - fontconfig.git/commitdiff
Bug 40452 - Running 'fc-match --all' core dumps when no fonts are installed
authorAkira TAGOH <akira@tagoh.org>
Tue, 21 Feb 2012 06:29:56 +0000 (15:29 +0900)
committerAkira TAGOH <akira@tagoh.org>
Tue, 21 Feb 2012 06:29:56 +0000 (15:29 +0900)
This would changes the behavior of FcFontSort().
it won't returns NULL afterward.

fc-match/fc-match.c
src/fcmatch.c

index e64b4bcdd37092575dfaf28aa2efca01dba7c0fa..095dd4e21125aef6f373d9239d0ab1a9712c2ad4 100644 (file)
@@ -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;
index 1b9162b46cde6ee2fe4974185f17c54939aed9ba..422bc384d2ecbabc2df33e3d10122381d985d9df 100644 (file)
@@ -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 ();