Fix assertion in FcCacheFini() again

The previous fix in fbc05949ef was wrong. reverting.

When reading older caches, FcDirCacheMapHelper() returns FcFalse and
it became the return value from FcDirCacheProcess() too, which is wrong.
Actually one of calls for FcDirCacheMapHelper() should be successfully
finished and closure should have a valid pointer for cache.

Due to this, the proper finalization process wasn't running against
cache in closure.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/227
This commit is contained in:
Akira TAGOH 2020-03-23 14:03:47 +09:00
parent 6def66164a
commit 6f6b397802
1 changed files with 15 additions and 2 deletions

View File

@ -365,6 +365,7 @@ FcDirCacheProcess (FcConfig *config, const FcChar8 *dir,
struct stat file_stat, dir_stat;
FcBool ret = FcFalse;
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
struct timeval latest_mtime = (struct timeval){ 0 };
if (sysroot)
d = FcStrBuildFilename (sysroot, dir, NULL);
@ -389,7 +390,6 @@ FcDirCacheProcess (FcConfig *config, const FcChar8 *dir,
#ifndef _WIN32
FcBool retried = FcFalse;
#endif
struct timeval latest_mtime = (struct timeval){ 0 };
if (sysroot)
cache_hashed = FcStrBuildFilename (sysroot, cache_dir, cache_base, NULL);
@ -445,6 +445,8 @@ FcDirCacheProcess (FcConfig *config, const FcChar8 *dir,
}
FcStrListDone (list);
if (closure)
return !!(*((FcCache **)closure) != NULL);
return ret;
}
@ -792,7 +794,18 @@ FcCacheFini (void)
int i;
for (i = 0; i < FC_CACHE_MAX_LEVEL; i++)
assert (fcCacheChains[i] == NULL);
{
if (FcDebug() & FC_DBG_CACHE)
{
if (fcCacheChains[i] != NULL)
{
FcCacheSkip *s = fcCacheChains[i];
printf("Fontconfig error: not freed %p (dir: %s, refcount %d)\n", s->cache, FcCacheDir(s->cache), s->ref.count);
}
}
else
assert (fcCacheChains[i] == NULL);
}
assert (fcCacheMaxLevel == 0);
free_lock ();