From: Jim Meyering Date: Tue, 20 Dec 2005 14:23:20 +0000 (+0000) Subject: (RW_USR): Remove definition. X-Git-Tag: v6.0~1060 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0344cfc55944d3993667c5b41bd9234ad35e4d4;p=thirdparty%2Fcoreutils.git (RW_USR): Remove definition. (make_dir_parents): Use S_IRWXU, now that read access is also required. Avoid a race condition, on systems where open honors O_NOFOLLOW. (make_dir_parents): Include chdir-safer.h. Use chdir_no_follow in place of chdir. --- diff --git a/lib/mkdir-p.c b/lib/mkdir-p.c index 3923fbee10..1fd5779946 100644 --- a/lib/mkdir-p.c +++ b/lib/mkdir-p.c @@ -39,14 +39,13 @@ #include "gettext.h" #define _(msgid) gettext (msgid) -#include "save-cwd.h" +#include "chdir-safer.h" #include "dirname.h" #include "error.h" #include "quote.h" +#include "save-cwd.h" #include "stat-macros.h" -#define WX_USR (S_IWUSR | S_IXUSR) - /* Ensure that the directory ARG exists. Create any leading directories that don't already exist, with @@ -128,10 +127,10 @@ make_dir_parents (char const *arg, strip_trailing_slashes (dir); full_dir = dir; - /* If leading directories shouldn't be writable or executable, + /* If leading directories shouldn't be readable, writable or executable, or should have set[ug]id or sticky bits set and we are setting their owners, we need to fix their permissions after making them. */ - if (((parent_mode & WX_USR) != WX_USR) + if (((parent_mode & S_IRWXU) != S_IRWXU) || ((owner != (uid_t) -1 || group != (gid_t) -1) && (parent_mode & (S_ISUID | S_ISGID | S_ISVTX)) != 0)) { @@ -223,7 +222,7 @@ make_dir_parents (char const *arg, mkdir process O(n^2) file name components. */ if (do_chdir) { - if (chdir (basename_dir) == 0) + if (chdir_no_follow (basename_dir) == 0) dir_known_to_exist = true; else if (dir_known_to_exist) {