+2006-02-06 Patrick Lam <plam@mit.edu>
+ Takashi Iwai <tiwai@suse.de>
+
+ * src/fccache.c (FcCacheReadDirs, FcCacheRead):
+
+ Don't loop infinitely on recursive symlinks (client-side).
+
2006-02-06 Takashi Iwai <tiwai@suse.de>
reviewed by: plam
* fc-cache/fc-cache.c (scanDirs, main):
static int
FcCacheReadDirs (FcConfig * config, FcGlobalCache * cache,
- FcStrList *list, FcFontSet * set)
+ FcStrList *list, FcFontSet * set, FcStrSet *processed_dirs)
{
int ret = 0;
FcChar8 *dir;
name = FcConfigNormalizeFontDir (config, dir);
if (name)
{
- if ((d = FcGlobalCacheDirFind (cache, (const char *)name)) != NULL &&
- d->state == FcGCDirUpdated)
+ if (FcStrSetMember (processed_dirs, dir))
continue;
+ FcStrSetAdd (processed_dirs, dir);
}
subdirs = FcStrSetCreate ();
ret++;
continue;
}
- ret += FcCacheReadDirs (config, cache, sublist, set);
+ ret += FcCacheReadDirs (config, cache, sublist, set, processed_dirs);
}
FcStrListDone (list);
return ret;
FcFontSet *
FcCacheRead (FcConfig *config, FcGlobalCache * cache)
{
- FcFontSet * s = FcFontSetCreate();
+ FcFontSet *s = FcFontSetCreate();
+ FcStrSet *processed_dirs;
+
if (!s)
return 0;
- if (FcCacheReadDirs (config, cache, FcConfigGetConfigDirs (config), s))
+ processed_dirs = FcStrSetCreate();
+ if (!processed_dirs)
goto bail;
+ if (FcCacheReadDirs (config, cache, FcConfigGetConfigDirs (config), s, processed_dirs))
+ goto bail1;
+
+ FcStrSetDestroy (processed_dirs);
return s;
+ bail1:
+ FcStrSetDestroy (processed_dirs);
bail:
FcFontSetDestroy (s);
return 0;