summaryrefslogtreecommitdiff
path: root/src/copy.h
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2007-12-01 10:09:57 +0100
committerJim Meyering <meyering@redhat.com>2007-12-01 10:09:57 +0100
commitb64119bc54791809b9fc3a225761b1c913fe66bc (patch)
tree15566919c6c92780e8677a300cef940668fe2bad /src/copy.h
parent317413874c935c8605ae3549e7575e03427b953e (diff)
downloadcoreutils-b64119bc54791809b9fc3a225761b1c913fe66bc.tar.gz
Fix a security race with "cp -p A B" when B already exists.
* src/copy.h (struct cp_options): New member owner_privileges. * src/copy.c (USE_ACL): Define to 0 if not defined, for convenience. (owner_failure_ok): New function. (set_owner): Avoid a security-related race by doing an extra chmod first if it looks like there might be trouble right after a chown. Accept a source struct stat rather than a uid and gid, and accept a boolean NEW_DST and destination struct stat. All callers changed. * src/copy.h (cp_options_default): New function, replacing the old chown_privileges. * src/copy.c (cp_options_default): Likewise. * src/cp.c (cp_option_init): Use it. * src/install.c (cp_option_init): Likewise. * src/mv.c (cp_option_init): Likewise.
Diffstat (limited to 'src/copy.h')
-rw-r--r--src/copy.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/copy.h b/src/copy.h
index 47c97f389..14104e642 100644
--- a/src/copy.h
+++ b/src/copy.h
@@ -124,6 +124,13 @@ struct cp_options
whose owner is not the effective user ID. */
bool chown_privileges;
+ /* Whether this process has appropriate privileges to do the
+ following operations on a file even when it is owned by some
+ other user: set the file's atime, mtime, mode, or ACL; remove or
+ rename an entry in the file even though it is a sticky directory,
+ or to mount on the file. */
+ bool owner_privileges;
+
/* If true, when copying recursively, skip any subdirectories that are
on different file systems from the one we started on. */
bool one_file_system;
@@ -230,7 +237,7 @@ bool copy (char const *src_name, char const *dst_name,
void dest_info_init (struct cp_options *);
void src_info_init (struct cp_options *);
-bool chown_privileges (void);
+void cp_options_default (struct cp_options *);
bool chown_failure_ok (struct cp_options const *);
mode_t cached_umask (void);