summaryrefslogtreecommitdiff
path: root/src/copy.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-10-18 20:56:38 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-10-18 20:56:38 +0000
commit11cf1d39f2fbe2dcfb6d268fd3e2a56334f1d224 (patch)
tree88f4a779b2d653dea98df29655bbc33eb50a7b6f /src/copy.c
parentf594f1fb387da55159e7591c97e17b76366730c8 (diff)
downloadcoreutils-11cf1d39f2fbe2dcfb6d268fd3e2a56334f1d224.tar.xz
* src/copy.c (copy_internal): Don't pass mkdir a mode greater than
7777. This matches historical 'cp' behavior and avoids some (though not all) implementation-defined behavior of mkdir. * src/cp.c (make_dir_parents_private): Likewise. * src/copy.c (copy_internal): Don't pass 'open' a mode greater than 777. This is required by POSIX. It doesn't make any difference in actual behavior on any host that I know of.
Diffstat (limited to 'src/copy.c')
-rw-r--r--src/copy.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/copy.c b/src/copy.c
index 2f03599e5..d1c005300 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -1505,7 +1505,11 @@ copy_internal (char const *src_name, char const *dst_name,
if (new_dst || !S_ISDIR (dst_sb.st_mode))
{
- if (mkdir (dst_name, src_mode) != 0)
+ /* POSIX says mkdir's behavior is implementation-defined when
+ (src_mode & ~S_IRWXUGO) != 0. However, common practice is
+ to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir
+ decide what to do with S_ISUID | S_ISGID | S_ISVTX. */
+ if (mkdir (dst_name, src_mode & CHMOD_MODE_BITS) != 0)
{
error (0, errno, _("cannot create directory %s"),
quote (dst_name));
@@ -1628,9 +1632,11 @@ copy_internal (char const *src_name, char const *dst_name,
{
copied_as_regular = true;
/* POSIX says the permission bits of the source file must be
- used as the 3rd argument in the open call, but that's not consistent
- with historical practice. */
- if (! copy_reg (src_name, dst_name, x, src_mode, &new_dst, &src_sb))
+ used as the 3rd argument in the open call. Historical
+ practice passed all the source mode bits to 'open', but the extra
+ bits were ignored, so it should be the same either way. */
+ if (! copy_reg (src_name, dst_name, x, src_mode & S_IRWXUGO,
+ &new_dst, &src_sb))
goto un_backup;
}
else if (S_ISFIFO (src_type))