Canonicalize dirname(3) behavior.
authorMatt Kraai <kraai@debian.org>
Fri, 24 Aug 2001 19:51:54 +0000 (19:51 -0000)
committerMatt Kraai <kraai@debian.org>
Fri, 24 Aug 2001 19:51:54 +0000 (19:51 -0000)
archival/tar.c
libbb/dirname.c
libbb/make_directory.c
libbb/unarchive.c
tar.c

index cf65798fffd6e665e297fcd6d2ebc36954ac3a9b..389d7f02e26ae1298f540ef45c20b6be5e8caefa 100644 (file)
@@ -342,9 +342,11 @@ tarExtractRegularFile(TarInfo *header, int extractFlag, int tostdoutFlag)
        if (extractFlag==TRUE && tostdoutFlag==FALSE) {
                /* Create the path to the file, just in case it isn't there...
                 * This should not screw up path permissions or anything. */
-               char *dir = dirname (header->name);
+               char *buf, *dir;
+               buf = xstrdup (header->name);
+               dir = dirname (buf);
                make_directory (dir, -1, FILEUTILS_RECUR);
-               free (dir);
+               free (buf);
                if ((outFd=open(header->name, O_CREAT|O_TRUNC|O_WRONLY, 
                                                header->mode & ~S_IFMT)) < 0) {
                        error_msg(io_error, header->name, strerror(errno)); 
index 5f839945d3dd68e37a5e18ebd992a03538014f1a..87db1f24f8b33730276db9f2312b23e60af94324 100644 (file)
@@ -22,7 +22,8 @@
 #include <string.h>
 #include "libbb.h"
 
-/* Return a string on the heap containing the directory component of PATH.  */
+/* Return a string containing the path name of the parent
+ * directory of PATH.  */
 
 char *dirname(const char *path)
 {
@@ -43,7 +44,8 @@ char *dirname(const char *path)
                s--;
 
        if (s < path)
-               return xstrdup (".");
-       else
-               return xstrndup (path, s - path + 1);
+               return ".";
+
+       s[1] = '\0';
+       return path;
 }
index 7b7fde911b0effea830832d12648da170b6caee4..a06a410d2ab546f2971adcd9282e1a16d1b0eec7 100644 (file)
@@ -50,13 +50,17 @@ int make_directory (char *path, long mode, int flags)
 
                if (stat (path, &st) < 0 && errno == ENOENT) {
                        int status;
-                       char *parent = dirname (path);
-                       mode_t mask = umask (0);
+                       char *buf, *parent;
+                       mode_t mask;
+
+                       mask = umask (0);
                        umask (mask);
 
+                       buf = xstrdup (path);
+                       parent = dirname (buf);
                        status = make_directory (parent, (0777 & ~mask) | 0300,
                                        FILEUTILS_RECUR);
-                       free (parent);
+                       free (buf);
 
                        if (status < 0 || make_directory (path, mode, 0) < 0)
                                return -1;
index 0d414a3a8535919d9e990640943db9b90a5d6a99..2d171b4ce0e836032f74d22fb9caf4745858224f 100644 (file)
@@ -127,13 +127,15 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f
                        }
                }
                if (function & extract_create_leading_dirs) { /* Create leading directories with default umask */
-                       char *parent = dirname(full_name);
+                       char *buf, *parent;
+                       buf = xstrdup(full_name);
+                       parent = dirname(full_name);
                        if (make_directory (parent, -1, FILEUTILS_RECUR) != 0) {
                                if ((function & extract_quiet) != extract_quiet) {
                                        error_msg("couldn't create leading directories");
                                }
                        }
-                       free (parent);
+                       free (buf);
                }
                switch(file_entry->mode & S_IFMT) {
                        case S_IFREG:
diff --git a/tar.c b/tar.c
index cf65798fffd6e665e297fcd6d2ebc36954ac3a9b..389d7f02e26ae1298f540ef45c20b6be5e8caefa 100644 (file)
--- a/tar.c
+++ b/tar.c
@@ -342,9 +342,11 @@ tarExtractRegularFile(TarInfo *header, int extractFlag, int tostdoutFlag)
        if (extractFlag==TRUE && tostdoutFlag==FALSE) {
                /* Create the path to the file, just in case it isn't there...
                 * This should not screw up path permissions or anything. */
-               char *dir = dirname (header->name);
+               char *buf, *dir;
+               buf = xstrdup (header->name);
+               dir = dirname (buf);
                make_directory (dir, -1, FILEUTILS_RECUR);
-               free (dir);
+               free (buf);
                if ((outFd=open(header->name, O_CREAT|O_TRUNC|O_WRONLY, 
                                                header->mode & ~S_IFMT)) < 0) {
                        error_msg(io_error, header->name, strerror(errno));