diff options
author | Patrick Lam <plam@MIT.EDU> | 2006-04-10 16:06:42 +0000 |
---|---|---|
committer | Patrick Lam <plam@MIT.EDU> | 2006-04-10 16:06:42 +0000 |
commit | 65448e8b2af9bec38f86ab45916a9bcc7726ae30 (patch) | |
tree | 348ddf0d6ce40daff5a27901f96ad794395c4875 | |
parent | ae2aafe6028be658bd1de0fe2dd309799bf575f7 (diff) | |
download | fontconfig-65448e8b2af9bec38f86ab45916a9bcc7726ae30.tar.gz |
src/fcdir.c (FcDirScanConfig) Don't leak in error cases (Coverity defects
#777, #1826)
reviewed by: plam
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | src/fcdir.c | 54 |
2 files changed, 43 insertions, 17 deletions
@@ -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; } |