settings: Use dirname(3) correctly

dirname(3) may return a pointer to a statically allocated buffer.
So freeing the returned value can result to undefined behavior. This was
noticed on FreeBSD where it caused very strange crashes.

It is also not thread-safe, which will be addressed later.
This commit is contained in:
Tobias Brunner 2014-02-21 14:58:01 +01:00
parent a21d4096e5
commit caf1770905
1 changed files with 4 additions and 4 deletions

View File

@ -1302,15 +1302,15 @@ static bool parse_files(linked_list_t *contents, char *file, int level,
}
else
{ /* base relative paths to the directory of the current file */
char *dir = strdup(file);
dir = dirname(dir);
char *path = strdup(file);
char *dir = dirname(path);
if (snprintf(pat, sizeof(pat), "%s/%s", dir, pattern) >= sizeof(pat))
{
DBG1(DBG_LIB, "include pattern too long, ignored");
free(dir);
free(path);
return TRUE;
}
free(dir);
free(path);
}
#ifdef HAVE_GLOB_H
{