summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Lam <plam@MIT.EDU>2006-04-10 16:06:42 +0000
committerPatrick Lam <plam@MIT.EDU>2006-04-10 16:06:42 +0000
commit65448e8b2af9bec38f86ab45916a9bcc7726ae30 (patch)
tree348ddf0d6ce40daff5a27901f96ad794395c4875
parentae2aafe6028be658bd1de0fe2dd309799bf575f7 (diff)
downloadfontconfig-65448e8b2af9bec38f86ab45916a9bcc7726ae30.tar.gz
src/fcdir.c (FcDirScanConfig) Don't leak in error cases (Coverity defects
#777, #1826) reviewed by: plam
-rw-r--r--ChangeLog6
-rw-r--r--src/fcdir.c54
2 files changed, 43 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index c999df4..6d1a348 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
2006-04-10 Frederic Crozat <fcrozat@mandriva.com>
reviewed by: plam
+ * src/fcdir.c (FcDirScanConfig)
+ Don't leak in error cases (Coverity defects #777, #1826)
+
+2006-04-10 Frederic Crozat <fcrozat@mandriva.com>
+ reviewed by: plam
+
* src/fccache.c: (FcDirCacheWrite):
Fix double free (spotted by Coverity, CID #1965).
diff --git a/src/fcdir.c b/src/fcdir.c
index f505bf5..4463b31 100644
--- a/src/fcdir.c
+++ b/src/fcdir.c
@@ -180,31 +180,44 @@ FcDirScanConfig (FcFontSet *set,
}
tmpSet = FcFontSetCreate();
- if (!tmpSet)
- {
- free (file);
- return FcFalse;
+ if (!tmpSet)
+ {
+ ret = FcFalse;
+ goto bail0;
}
dirlistlen = 0;
dirlistalloc = 8;
dirlist = malloc(dirlistalloc * sizeof(FcChar8 *));
- if (!dirlist)
- return FcFalse;
+ if (!dirlist)
+ {
+ ret = FcFalse;
+ goto bail1;
+ }
while ((e = readdir (d)))
{
if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN)
{
if (dirlistlen == dirlistalloc)
{
+ FcChar8 **tmp_dirlist;
+
dirlistalloc *= 2;
- dirlist = realloc(dirlist, dirlistalloc * sizeof(FcChar8 *));
- if (!dirlist)
- return FcFalse;
+ tmp_dirlist = realloc(dirlist,
+ dirlistalloc * sizeof(FcChar8 *));
+ if (!tmp_dirlist)
+ {
+ ret = FcFalse;
+ goto bail2;
+ }
+ dirlist = tmp_dirlist;
}
dirlist[dirlistlen] = malloc(strlen (e->d_name) + 1);
- if (!dirlist[dirlistlen])
- return FcFalse;
+ if (!dirlist[dirlistlen])
+ {
+ ret = FcFalse;
+ goto bail2;
+ }
strcpy((char *)dirlist[dirlistlen], e->d_name);
dirlistlen++;
}
@@ -217,11 +230,6 @@ FcDirScanConfig (FcFontSet *set,
ret = FcFileScanConfig (tmpSet, dirs, cache, blanks, file, force, config);
i++;
}
- for (i = 0; i < dirlistlen; i++)
- free(dirlist[i]);
- free (dirlist);
- free (file);
- closedir (d);
/*
* Now that the directory has been scanned,
* add the cache entry
@@ -238,8 +246,20 @@ FcDirScanConfig (FcFontSet *set,
free (tmpSet->fonts);
}
FcMemFree (FC_MEM_FONTSET, sizeof (FcFontSet));
+
+ bail2:
+ for (i = 0; i < dirlistlen; i++)
+ free(dirlist[i]);
+
+ free (dirlist);
+
+ bail1:
free (tmpSet);
-
+
+ bail0:
+ closedir (d);
+
+ free (file);
return ret;
}