Fix double free (spotted by Coverity, CID #1965).
authorPatrick Lam <plam@MIT.EDU>
Mon, 10 Apr 2006 15:46:34 +0000 (15:46 +0000)
committerPatrick Lam <plam@MIT.EDU>
Mon, 10 Apr 2006 15:46:34 +0000 (15:46 +0000)
Check if pattern is not null before using it (Coverity defect #1883).
Fix memory leak with hash collision (Coverity defect #1829).
Fix memory leak when bail cases (Coverity defect #1828).
Don't leak directory name (Coverity defect #1827).
reviewed by: plam

ChangeLog
fc-match/fc-match.c
src/fccache.c
src/fccfg.c

index 02171b1..c999df4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2006-04-10  Frederic Crozat  <fcrozat@mandriva.com>
+       reviewed by: plam
+
+       * src/fccache.c: (FcDirCacheWrite):
+       Fix double free (spotted by Coverity, CID #1965).
+
+       * fc-match/fc-match.c: (main):
+       Check if pattern is not null before using it (Coverity defect #1883).
+
+       * src/fccache.c: (FcDirCacheWrite):
+       Fix memory leak with hash collision (Coverity defect #1829).
+
+       * src/fccfg.c: (FcConfigBuildFonts):
+       Fix memory leak when bail cases (Coverity defect #1828).
+
+       * src/fccache.c: (FcGlobalCacheLoad):
+       Don't leak directory name (Coverity defect #1827).
+
 2006-04-07  Dominic Lachowicz  <cinamod@hotmail.com>
        reviewed by: plam
        * fc-cache/Makefile.am:
index 2666620..fa45018 100644 (file)
@@ -134,6 +134,9 @@ main (int argc, char **argv)
     else
        pat = FcPatternCreate ();
 
+    if (!pat)
+       return 1;
+
     FcConfigSubstitute (0, pat, FcMatchPattern);
     FcDefaultSubstitute (pat);
     
@@ -147,8 +150,7 @@ main (int argc, char **argv)
        if (match)
            FcFontSetAdd (fs, match);
     }
-    if (pat)
-       FcPatternDestroy (pat);
+    FcPatternDestroy (pat);
 
     if (fs)
     {
index 248c6d1..de95f36 100644 (file)
@@ -236,7 +236,7 @@ FcGlobalCacheLoad (FcGlobalCache    *cache,
             FcCache md;
            off_t off;
 
-           FcStrSetAdd (staleDirs, FcStrCopy ((FcChar8 *)name_buf));
+           FcStrSetAdd (staleDirs, (FcChar8 *)name_buf);
 
            /* skip subdirs */
            while (FcCacheReadString (cache->fd, subdirName, 
@@ -1311,12 +1311,16 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
        if(!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf))
        {
            close (fd);
+            FcStrFree ((FcChar8 *)cache_hashed);
            continue;
        }
        close (fd);
 
-       if (strcmp (name_buf, cache_file) != 0)
+       if (strcmp (name_buf, cache_file) != 0) 
+        {
+            FcStrFree ((FcChar8 *)cache_hashed);
            continue;
+        }
 
        break;
     } while (1);
@@ -1445,7 +1449,7 @@ FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
     free (header);
     close(fd);
     if (!FcAtomicReplaceOrig(atomic))
-        goto bail5;
+        goto bail3;
     FcStrFree ((FcChar8 *)cache_hashed);
     FcStrFree ((FcChar8 *)cache_file);
     FcAtomicUnlock (atomic);
index cae41b0..7f8a8ff 100644 (file)
@@ -335,6 +335,7 @@ FcConfigBuildFonts (FcConfig *config)
     
     return FcTrue;
 bail2:
+    FcGlobalCacheDestroy (cache);
     FcStrSetDestroy (oldDirs);
 bail1:
     FcFontSetDestroy (fonts);