From d9d47c3078e0f94d1fbd445f972a08c52e50417e Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Mon, 30 Sep 2002 20:14:57 +0000 Subject: Patch from Konstantin Isakov : In most cases, dirname returns the same argument it was given, so this code works nice, but there's one special case: when the name contains no dirname, it returns "." (stored statically in the body of itself), and we get a segfault in attempt to free() it. This patch fixes this problem. --- archival/libunarchive/data_extract_all.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'archival/libunarchive') diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c index a80f422b7..39af2e3e7 100644 --- a/archival/libunarchive/data_extract_all.c +++ b/archival/libunarchive/data_extract_all.c @@ -16,9 +16,10 @@ extern void data_extract_all(archive_handle_t *archive_handle) int res; if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) { - char *dir = dirname(strdup(file_header->name)); - make_directory (dir, 0777, FILEUTILS_RECUR); - } + char *name = strdup(file_header->name); + make_directory (dirname(name), 0777, FILEUTILS_RECUR); + free(name); + } /* Create the file */ switch(file_header->mode & S_IFMT) { -- cgit v1.2.3