summaryrefslogtreecommitdiff
path: root/receiver.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2011-01-01 17:30:26 -0800
committerWayne Davison <wayned@samba.org>2011-01-01 18:09:57 -0800
commitd3f5c628d7bdec6f7334bbae68a7bee1f5285815 (patch)
tree76409973039d2c613de943c81ea090d65a8de130 /receiver.c
parent8b6ebde1f328c37fededb0acad85c0b0b5b835e5 (diff)
downloadrsync-d3f5c628d7bdec6f7334bbae68a7bee1f5285815.tar.gz
Avoid directory permission issues with --fake-super.
Fixes bug 7070.
Diffstat (limited to 'receiver.c')
-rw-r--r--receiver.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/receiver.c b/receiver.c
index 0bc65177..a5192475 100644
--- a/receiver.c
+++ b/receiver.c
@@ -24,6 +24,7 @@
extern int dry_run;
extern int do_xfers;
+extern int am_root;
extern int am_server;
extern int inc_recurse;
extern int log_before_transfer;
@@ -173,15 +174,25 @@ int get_tmpname(char *fnametmp, const char *fname, BOOL make_unique)
int open_tmpfile(char *fnametmp, const char *fname, struct file_struct *file)
{
int fd;
+ mode_t added_perms;
if (!get_tmpname(fnametmp, fname, False))
return -1;
+ if (am_root < 0) {
+ /* For --fake-super, the file must be useable by the copying
+ * user, just like it would be for root. */
+ added_perms = S_IRUSR|S_IWUSR;
+ } else {
+ /* For a normal copy, we need to be able to tweak things like xattrs. */
+ added_perms = S_IWUSR;
+ }
+
/* We initially set the perms without the setuid/setgid bits or group
* access to ensure that there is no race condition. They will be
* correctly updated after the right owner and group info is set.
* (Thanks to snabb@epipe.fi for pointing this out.) */
- fd = do_mkstemp(fnametmp, (file->mode & INITACCESSPERMS) | S_IWUSR);
+ fd = do_mkstemp(fnametmp, (file->mode|added_perms) & INITACCESSPERMS);
#if 0
/* In most cases parent directories will already exist because their
@@ -191,7 +202,7 @@ int open_tmpfile(char *fnametmp, const char *fname, struct file_struct *file)
&& make_path(fnametmp, MKP_SKIP_SLASH | MKP_DROP_NAME) == 0) {
/* Get back to name with XXXXXX in it. */
get_tmpname(fnametmp, fname, False);
- fd = do_mkstemp(fnametmp, file->mode & INITACCESSPERMS);
+ fd = do_mkstemp(fnametmp, (file->mode|added_perms) & INITACCESSPERMS);
}
#endif