From caf1770905e81b95fbe7f3e9125f24719368c3e9 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 21 Feb 2014 14:58:01 +0100 Subject: [PATCH] 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. --- src/libstrongswan/utils/settings.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libstrongswan/utils/settings.c b/src/libstrongswan/utils/settings.c index a2c892211..27a665d16 100644 --- a/src/libstrongswan/utils/settings.c +++ b/src/libstrongswan/utils/settings.c @@ -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 {