diff options
| author | David Dykstra <dwd@samba.org> | 1999-03-01 19:24:39 +0000 |
|---|---|---|
| committer | David Dykstra <dwd@samba.org> | 1999-03-01 19:24:39 +0000 |
| commit | 460f6b990a89a13060b57e1e52f72346bf020679 (patch) | |
| tree | c4b3d91d37566edbca65262c4c0ee1e13eb19143 /uidlist.c | |
| parent | 896bd482c0c87d11e19f9bcffbcb35c6aba00e43 (diff) | |
| download | android_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.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -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) { |
