]> git.wh0rd.org - fontconfig.git/blobdiff - src/fccache.c
Stop trampling the directory name when writing out caches. (with Mike
[fontconfig.git] / src / fccache.c
index 688da877ef1e66f45c2cb8a4e491498982389b65..349bc9ab500a69a12e32d5b107af1afbca873417 100644 (file)
@@ -382,6 +382,7 @@ FcGlobalCacheSave (FcGlobalCache    *cache,
               S_IRUSR | S_IWUSR);
     if (fd == -1)
        goto bail2;
+    FcCacheWriteString (fd, FC_GLOBAL_MAGIC_COOKIE);
 
     fd_orig = open ((char *) FcAtomicOrigFile(atomic), O_RDONLY);
 
@@ -393,7 +394,12 @@ FcGlobalCacheSave (FcGlobalCache    *cache,
                                                 current_arch_machine_name);
 
     if (current_arch_start < 0)
-       current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
+    {
+       off_t i = lseek(fd_orig, 0, SEEK_END);
+       if (i < strlen (FC_GLOBAL_MAGIC_COOKIE)+1)
+           i = strlen (FC_GLOBAL_MAGIC_COOKIE)+1;
+       current_arch_start = FcCacheNextOffset (i);
+    }
 
     if (!FcCacheCopyOld(fd, fd_orig, current_arch_start))
        goto bail3;
@@ -419,7 +425,6 @@ FcGlobalCacheSave (FcGlobalCache    *cache,
     }
     truncate_to -= current_arch_start;
 
-    FcCacheWriteString (fd, FC_GLOBAL_MAGIC_COOKIE);
     sprintf (header, "%8x ", (int)truncate_to);
     strcat (header, current_arch_machine_name);
     if (!FcCacheWriteString (fd, header))
@@ -900,7 +905,10 @@ FcDirCacheOpen (const FcChar8 *dir)
 
        cache_hashed = FcDirCacheHashName (cache_file, collisions++);
        if (!cache_hashed)
+       {
+           FcStrFree ((FcChar8 *)cache_file);
            return -1;
+       }
 
        if (fd > 0)
            close (fd);
@@ -908,7 +916,10 @@ FcDirCacheOpen (const FcChar8 *dir)
        FcStrFree ((FcChar8 *)cache_hashed);
 
        if (fd == -1)
+       {
+           FcStrFree ((FcChar8 *)cache_file);
            return -1;
+       }
        FcCacheReadString (fd, name_buf, sizeof (name_buf));
        if (!strlen(name_buf))
            goto bail;
@@ -920,11 +931,13 @@ FcDirCacheOpen (const FcChar8 *dir)
            continue;
        }
        FcStrFree (name_buf_dir);
-       found = c.st_ino == dir_stat.st_ino;
+       found = (c.st_ino == dir_stat.st_ino) && (c.st_dev == dir_stat.st_dev);
     } while (!found);
+    FcStrFree ((FcChar8 *)cache_file);
     return fd;
 
  bail:
+    FcStrFree ((FcChar8 *)cache_file);
     close (fd);
     return -1;
 }
@@ -1151,7 +1164,12 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
             FcCacheSkipToArch(fd_orig, current_arch_machine_name);
 
     if (current_arch_start < 0)
-       current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
+    {
+       off_t i = lseek(fd_orig, 0, SEEK_END);
+       if (i < strlen (FC_GLOBAL_MAGIC_COOKIE)+1)
+           i = strlen (FC_GLOBAL_MAGIC_COOKIE)+1;
+       current_arch_start = FcCacheNextOffset (i);
+    }
 
     if (fd_orig != -1 && !FcCacheCopyOld(fd, fd_orig, current_arch_start))
        goto bail4;
@@ -1200,6 +1218,7 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
     if (!FcAtomicReplaceOrig(atomic))
         goto bail5;
     FcStrFree ((FcChar8 *)cache_hashed);
+    FcStrFree ((FcChar8 *)cache_file);
     FcAtomicUnlock (atomic);
     FcAtomicDestroy (atomic);
     return FcTrue;
@@ -1216,7 +1235,7 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
     FcStrFree ((FcChar8 *)cache_hashed);
  bail0:
     unlink ((char *)cache_file);
-    free (cache_file);
+    FcStrFree ((FcChar8 *)cache_file);
     if (current_dir_block)
         free (current_dir_block);
  bail: