[Fontconfig] Re: Bug in fc-cat with user cache

Mike FABIAN mfabian at suse.de
Fri Jan 20 06:39:20 PST 2006


Mike FABIAN <mfabian at suse.de> さんは書きました:

> Patrick Lam <plam at MIT.EDU> さんは書きました:
>
>> Mike FABIAN wrote:
>>> Yes, I can confirm that it is still incorrect like Frederic writes.
>>> What was wrong with my attached patch? I'm not sure
>>> but I think something similar is necessary. 	    if
>>> (!FcDirCacheConsume (cache->fd, dir, set, config))
>>> always adds the top-level directory to the list of directories
>>> which is then used in FcConfigNormalizeFontDir(). For example it adds
>>> the same directory /usr/X11R6/lib/X11/fonts/ many times but never
>>> the subdirectories like /usr/X11R6/lib/X11/fonts/Type1/ ...
>>> Replacing "dir" by "d->name" like
>>> 	    if (!FcDirCacheConsume (cache->fd, d->name, set, config))
>>> seems to fix this because now the correct directory names area added
>>> to the list.
>>
>> I don't think it should be necessary if you don't normalize the path
>> in the outer fc-cat loop, because you have to treat the directory
>> anyway before you can emit the cache, which should cause the proper
>> directory to be added to fontDirs.  Clearly the present code is
>> incorrect, and I'll look at it (since I'm now back in civilization),
>> but I think that we can avoid the issues involved with your patch.
>>
>> Also, if d->name and dir don't match, there's something wrong...
>
> Then why is the comparison done like this in FcGlobalCacheReadDir():
>
>     if (strncmp (d->name, dir, strlen(dir)) == 0)
>
> ?
>
> That checks whether "d->name" is a subdirectory of "dir".
>
> If "d->name" and "dir" have to match here, the comparison
> should be
>
>     if (strcmp (d->name, dir) == 0)
>
> But then it would almost always fail, except for the top-level
> directory.
>
> Can't you reproduce the following problem?:

[... procedure how to reproduce ...]

When reading a user specific cache like $HOME/.fonts.cache-2, the
cache may contain information for many font directories.

For that reason the code in FcGlobalCacheReadDir() loops over
all dirs found in "cache".

    for (d = cache->dirs; d; d = d->next)

Therefore, the directory given within that loop as a parameter to the
FcDirCacheConsume() call must be the directory from the current value
of "d" in that loop, i.e. "d->name".

Therefore I believe my patch is correct and I cannot find any issues
with that patch. I just fixes the problem described in my last mail.

-- 
Mike FABIAN   <mfabian at suse.de>   http://www.suse.de/~mfabian
睡眠不足はいい仕事の敵だ。



More information about the Fontconfig mailing list