[Fontconfig] possible bug in FcCharSetForLang

Egmont Koblinger egmont at uhulinux.hu
Thu Mar 2 11:01:43 PST 2006


Trying to catch a bug (in which I haven't succeeded, see my next mail)
I found a suspicious code in fontconfig-2.3.94/src/fclang.c. It says:

=== SNIP ===
const FcCharSet *
FcCharSetForLang (const FcChar8 *lang)
    int         i;
    int         country = -1;


    for (i = 0; i < NUM_LANG_CHAR_SET; i++)
        switch (FcLangCompare (lang, fcLangCharSets[i].lang)) {
        case FcLangEqual:
            return &fcLangCharSets[i].charset;
        case FcLangDifferentCountry:
            if (country == -1)
                country = i;
    if (country == -1)
        return 0;
    return &fcLangCharSets[i].charset;
=== SNIP ===

I don't know what this code exactly stands for, but I have a feeling that
the last return statement should rather be this:

    return &fcLangCharSets[country].charset;

Currently it returns a pointer to a memory segment that is (I don't know)
most likely either uninitialized or contains terminating null elements,
since i is guaranteed to equal to NUM_LANG_CHAR_SET, furthermore country has
no real integer meaning, it's basically just a boolean (either -1 or not)
and the first "if (country == -1)" testing makes no sense either.

I guess it was rather intended to return the first charset for which the
language at least partially (same lang but different country) matches, which
is remembered in country.


More information about the Fontconfig mailing list