Fix fc-cache crash caused by looking up NULL object incorrectly
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 16 Jan 2013 13:30:44 +0000 (07:30 -0600)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 16 Jan 2013 13:31:15 +0000 (07:31 -0600)
We were returning a skiplist node when looking up NULL!

src/fccache.c
src/fccfg.c

index ddcf070..610b8f0 100644 (file)
@@ -449,6 +449,9 @@ FcCacheFindByAddrUnlocked (void *object)
     FcCacheSkip    **next = fcCacheChains;
     FcCacheSkip    *s;
 
+    if (!object)
+       return NULL;
+
     /*
      * Walk chain pointers one level at a time
      */
@@ -556,7 +559,7 @@ FcCacheObjectDereference (void *object)
     skip = FcCacheFindByAddrUnlocked (object);
     if (skip)
     {
-       if (FcRefDec (&skip->ref) <= 1)
+       if (FcRefDec (&skip->ref) == 1)
            FcDirCacheDisposeUnlocked (skip->cache);
     }
     unlock_cache ();
@@ -1109,6 +1112,7 @@ FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose)
                            cache_dir, ent->d_name, target_dir);
                remove = FcTrue;
            }
+           FcDirCacheUnload (cache);
        }
        if (remove)
        {
@@ -1118,7 +1122,6 @@ FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose)
                ret = FcFalse;
            }
        }
-       FcDirCacheUnload (cache);
         FcStrFree (file_name);
     }
 
index 3e9fdab..12d7e1a 100644 (file)
@@ -337,8 +337,8 @@ FcConfigAddCache (FcConfig *config, FcCache *cache,
            if (!FcConfigAcceptFont (config, font))
                continue;
                
-           nref++;
-           FcFontSetAdd (config->fonts[set], font);
+           if (FcFontSetAdd (config->fonts[set], font))
+               nref++;
        }
        FcDirCacheReference (cache, nref);
     }