[Fontconfig] possible bug in FcCharSetForLang

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


Hi,

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;
        default:
            break;
        }
    }
    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.



-- 
Egmont


More information about the Fontconfig mailing list