From d0344cfc55944d3993667c5b41bd9234ad35e4d4 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 20 Dec 2005 14:23:20 +0000 Subject: [PATCH] (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. --- lib/mkdir-p.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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) { -- 2.47.3