From a18ca17b6211f62fbd1d893811b94b8c83db4cc0 Mon Sep 17 00:00:00 2001 From: Akira TAGOH Date: Tue, 21 Feb 2012 15:29:56 +0900 Subject: [PATCH] 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. --- fc-match/fc-match.c | 5 +++++ src/fcmatch.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) 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 #include #include #include @@ -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 (); -- 2.39.2