src/fcdir.c (FcDirScanConfig) Don't leak in error cases (Coverity defects
#777, #1826) reviewed by: plam
This commit is contained in:
parent
ae2aafe602
commit
65448e8b2a
|
@ -1,3 +1,9 @@
|
||||||
|
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>
|
2006-04-10 Frederic Crozat <fcrozat@mandriva.com>
|
||||||
reviewed by: plam
|
reviewed by: plam
|
||||||
|
|
||||||
|
|
54
src/fcdir.c
54
src/fcdir.c
|
@ -180,31 +180,44 @@ FcDirScanConfig (FcFontSet *set,
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpSet = FcFontSetCreate();
|
tmpSet = FcFontSetCreate();
|
||||||
if (!tmpSet)
|
if (!tmpSet)
|
||||||
{
|
{
|
||||||
free (file);
|
ret = FcFalse;
|
||||||
return FcFalse;
|
goto bail0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dirlistlen = 0;
|
dirlistlen = 0;
|
||||||
dirlistalloc = 8;
|
dirlistalloc = 8;
|
||||||
dirlist = malloc(dirlistalloc * sizeof(FcChar8 *));
|
dirlist = malloc(dirlistalloc * sizeof(FcChar8 *));
|
||||||
if (!dirlist)
|
if (!dirlist)
|
||||||
return FcFalse;
|
{
|
||||||
|
ret = FcFalse;
|
||||||
|
goto bail1;
|
||||||
|
}
|
||||||
while ((e = readdir (d)))
|
while ((e = readdir (d)))
|
||||||
{
|
{
|
||||||
if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN)
|
if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN)
|
||||||
{
|
{
|
||||||
if (dirlistlen == dirlistalloc)
|
if (dirlistlen == dirlistalloc)
|
||||||
{
|
{
|
||||||
|
FcChar8 **tmp_dirlist;
|
||||||
|
|
||||||
dirlistalloc *= 2;
|
dirlistalloc *= 2;
|
||||||
dirlist = realloc(dirlist, dirlistalloc * sizeof(FcChar8 *));
|
tmp_dirlist = realloc(dirlist,
|
||||||
if (!dirlist)
|
dirlistalloc * sizeof(FcChar8 *));
|
||||||
return FcFalse;
|
if (!tmp_dirlist)
|
||||||
|
{
|
||||||
|
ret = FcFalse;
|
||||||
|
goto bail2;
|
||||||
|
}
|
||||||
|
dirlist = tmp_dirlist;
|
||||||
}
|
}
|
||||||
dirlist[dirlistlen] = malloc(strlen (e->d_name) + 1);
|
dirlist[dirlistlen] = malloc(strlen (e->d_name) + 1);
|
||||||
if (!dirlist[dirlistlen])
|
if (!dirlist[dirlistlen])
|
||||||
return FcFalse;
|
{
|
||||||
|
ret = FcFalse;
|
||||||
|
goto bail2;
|
||||||
|
}
|
||||||
strcpy((char *)dirlist[dirlistlen], e->d_name);
|
strcpy((char *)dirlist[dirlistlen], e->d_name);
|
||||||
dirlistlen++;
|
dirlistlen++;
|
||||||
}
|
}
|
||||||
|
@ -217,11 +230,6 @@ FcDirScanConfig (FcFontSet *set,
|
||||||
ret = FcFileScanConfig (tmpSet, dirs, cache, blanks, file, force, config);
|
ret = FcFileScanConfig (tmpSet, dirs, cache, blanks, file, force, config);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
for (i = 0; i < dirlistlen; i++)
|
|
||||||
free(dirlist[i]);
|
|
||||||
free (dirlist);
|
|
||||||
free (file);
|
|
||||||
closedir (d);
|
|
||||||
/*
|
/*
|
||||||
* Now that the directory has been scanned,
|
* Now that the directory has been scanned,
|
||||||
* add the cache entry
|
* add the cache entry
|
||||||
|
@ -238,8 +246,20 @@ FcDirScanConfig (FcFontSet *set,
|
||||||
free (tmpSet->fonts);
|
free (tmpSet->fonts);
|
||||||
}
|
}
|
||||||
FcMemFree (FC_MEM_FONTSET, sizeof (FcFontSet));
|
FcMemFree (FC_MEM_FONTSET, sizeof (FcFontSet));
|
||||||
|
|
||||||
|
bail2:
|
||||||
|
for (i = 0; i < dirlistlen; i++)
|
||||||
|
free(dirlist[i]);
|
||||||
|
|
||||||
|
free (dirlist);
|
||||||
|
|
||||||
|
bail1:
|
||||||
free (tmpSet);
|
free (tmpSet);
|
||||||
|
|
||||||
|
bail0:
|
||||||
|
closedir (d);
|
||||||
|
|
||||||
|
free (file);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue