]> git.wh0rd.org - fontconfig.git/commitdiff
Takashi Iwai <tiwai@suse.de>
authorPatrick Lam <plam@MIT.EDU>
Tue, 7 Feb 2006 02:22:50 +0000 (02:22 +0000)
committerPatrick Lam <plam@MIT.EDU>
Tue, 7 Feb 2006 02:22:50 +0000 (02:22 +0000)
Don't loop infinitely on recursive symlinks (client-side).

ChangeLog
src/fccache.c

index 5bb68329295c1bf2317574eba4fc4c87bb7d4387..8378d5de77ec476b27deb8071351f5f2eb2bf813 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+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):
index e8364744de55709e90eb319625c5bafbe269c766..f2a41d4eae68defb58cce5fb8651ab9e29447505 100644 (file)
@@ -863,7 +863,7 @@ FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config)
 
 static int
 FcCacheReadDirs (FcConfig * config, FcGlobalCache * cache, 
-                FcStrList *list, FcFontSet * set)
+                FcStrList *list, FcFontSet * set, FcStrSet *processed_dirs)
 {
     int                        ret = 0;
     FcChar8            *dir;
@@ -887,9 +887,9 @@ FcCacheReadDirs (FcConfig * config, FcGlobalCache * cache,
        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 ();
@@ -955,7 +955,7 @@ FcCacheReadDirs (FcConfig * config, FcGlobalCache * cache,
            ret++;
            continue;
        }
-       ret += FcCacheReadDirs (config, cache, sublist, set);
+       ret += FcCacheReadDirs (config, cache, sublist, set, processed_dirs);
     }
     FcStrListDone (list);
     return ret;
@@ -964,15 +964,24 @@ FcCacheReadDirs (FcConfig * config, FcGlobalCache * cache,
 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;