diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-15 19:18:35 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-15 19:18:35 +0000 |
commit | 11152e30e3d8091a76adf2bfe59754d93becf724 (patch) | |
tree | eb3d3a084b931938aed97b3b51ce640232707e36 | |
parent | cd785fb716769228082ab1fd690d7916e3cc9cee (diff) |
mkdir: fix "uname 0222; mkdir foo/bar" case
(by Doug Graham <dgraham AT nortel.com>)
function old new delta
bb_make_directory 291 280 -11
-rw-r--r-- | libbb/make_directory.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/libbb/make_directory.c b/libbb/make_directory.c index 5c71aff92..df0b4a13d 100644 --- a/libbb/make_directory.c +++ b/libbb/make_directory.c @@ -35,17 +35,10 @@ int FAST_FUNC bb_make_directory(char *path, long mode, int flags) struct stat st; mask = umask(0); - if (mode == -1) { - umask(mask); - mode = (S_IXUSR | S_IXGRP | S_IXOTH | - S_IWUSR | S_IWGRP | S_IWOTH | - S_IRUSR | S_IRGRP | S_IROTH) & ~mask; - } else { - umask(mask & ~0300); - } + umask(mask & ~0300); /* Ensure intermediate dirs are wx */ - do { - c = 0; + while (1) { + c = '\0'; if (flags & FILEUTILS_RECUR) { /* Get the parent. */ /* Bypass leading non-'/'s and then subsequent '/'s. */ @@ -54,20 +47,24 @@ int FAST_FUNC bb_make_directory(char *path, long mode, int flags) do { ++s; } while (*s == '/'); - c = *s; /* Save the current char */ - *s = 0; /* and replace it with nul. */ + c = *s; /* Save the current char */ + *s = '\0'; /* and replace it with nul. */ break; } ++s; } } + if (!c) /* Last component uses orig umask */ + umask(mask); + if (mkdir(path, 0777) < 0) { /* If we failed for any other reason than the directory - * already exists, output a diagnostic and return -1.*/ + * already exists, output a diagnostic and return -1. */ if (errno != EEXIST - || !(flags & FILEUTILS_RECUR) - || (stat(path, &st) < 0 || !S_ISDIR(st.st_mode))) { + || !(flags & FILEUTILS_RECUR) + || ((stat(path, &st) < 0) || !S_ISDIR(st.st_mode)) + ) { fail_msg = "create"; umask(mask); break; @@ -82,11 +79,10 @@ int FAST_FUNC bb_make_directory(char *path, long mode, int flags) } if (!c) { - /* Done. If necessary, updated perms on the newly + /* Done. If necessary, update perms on the newly * created directory. Failure to update here _is_ - * an error.*/ - umask(mask); - if ((mode != -1) && (chmod(path, mode) < 0)){ + * an error. */ + if ((mode != -1) && (chmod(path, mode) < 0)) { fail_msg = "set permissions of"; break; } @@ -95,8 +91,7 @@ int FAST_FUNC bb_make_directory(char *path, long mode, int flags) /* Remove any inserted nul from the path (recursive mode). */ *s = c; - - } while (1); + } /* while (1) */ bb_perror_msg("cannot %s directory '%s'", fail_msg, path); return -1; |