aboutsummaryrefslogtreecommitdiffstats
path: root/uidlist.c
diff options
context:
space:
mode:
authorDavid Dykstra <dwd@samba.org>1999-03-01 19:24:39 +0000
committerDavid Dykstra <dwd@samba.org>1999-03-01 19:24:39 +0000
commit460f6b990a89a13060b57e1e52f72346bf020679 (patch)
treec4b3d91d37566edbca65262c4c0ee1e13eb19143 /uidlist.c
parent896bd482c0c87d11e19f9bcffbcb35c6aba00e43 (diff)
downloadandroid_external_rsync-460f6b990a89a13060b57e1e52f72346bf020679.tar.gz
android_external_rsync-460f6b990a89a13060b57e1e52f72346bf020679.tar.bz2
android_external_rsync-460f6b990a89a13060b57e1e52f72346bf020679.zip
Prevent the -g option from preserving groups that a non-root receiver
does not belong to, in these two ways: 1. If a group mapping doesn't exist for a group name, do not preserve it for a non-root receiver. This is especially evident with the sender is a daemon using chroot because then no mappings are available. 2. Before setting the group on a file make sure that it is in the list of groups returned by getgroups(). The same thing is done by chgrp on systems that support bsd-style chown/chgrp, and this enforces that it happens the same way on all systems. Overhead is very little, especially since most systems don't allow more then 16 groups per user.
Diffstat (limited to 'uidlist.c')
-rw-r--r--uidlist.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/uidlist.c b/uidlist.c
index eff8749b..e4b61b88 100644
--- a/uidlist.c
+++ b/uidlist.c
@@ -28,6 +28,7 @@
extern int preserve_uid;
extern int preserve_gid;
extern int numeric_ids;
+extern int am_root;
struct idlist {
struct idlist *next;
@@ -122,7 +123,10 @@ static gid_t match_gid(gid_t gid)
list = list->next;
}
- last_out = gid;
+ if (am_root)
+ last_out = gid;
+ else
+ last_out = -1;
return last_out;
}
@@ -276,12 +280,12 @@ void recv_uid_list(int f, struct file_list *flist)
}
}
- if (!uidlist && !gidlist) return;
+ if (!(am_root && preserve_uid) && !preserve_gid) return;
/* now convert the uid/gid of all files in the list to the mapped
uid/gid */
for (i=0;i<flist->count;i++) {
- if (preserve_uid && flist->files[i]->uid != 0) {
+ if (am_root && preserve_uid && flist->files[i]->uid != 0) {
flist->files[i]->uid = match_uid(flist->files[i]->uid);
}
if (preserve_gid && flist->files[i]->gid != 0) {