The branch, b3.0.x has been updated via 72193c8 Some uid/gid fixes for (id_t)-1. from b178eb0 Allow a failure of EINVAL to mean no ACLs are available. (If our POSIX types aren't valid, we can't handle the ACLs.)
;a=shortlog;h=b3.0.x - Log ----------------------------------------------------------------- commit 72193c82a60ce52550c91d9f2596dedd3d16dde0 Author: Wayne Davison <way...@samba.org> Date: Tue Feb 22 10:48:13 2011 -0800 Some uid/gid fixes for (id_t)-1. The code now avoids any special internal meaning for gid -1. If chown() is called with a uid or gid of -1, complain that the ID is not settable and signal a transfer error. ----------------------------------------------------------------------- Summary of changes: rsync.c | 10 +++++++--- uidlist.c | 8 +++----- 2 files changed, 10 insertions(+), 8 deletions(-) Changeset truncated at 500 lines: diff --git a/rsync.c b/rsync.c index bb58fc9..143eb38 100644 --- a/rsync.c +++ b/rsync.c @@ -463,9 +463,9 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, } } if (am_root >= 0) { - if (do_lchown(fname, - change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid, - change_gid ? (gid_t)F_GROUP(file) : sxp->st.st_gid) != 0) { + uid_t uid = change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid; + gid_t gid = change_gid ? (gid_t)F_GROUP(file) : sxp->st.st_gid; + if (do_lchown(fname, uid, gid) != 0) { /* We shouldn't have attempted to change uid * or gid unless have the privilege. */ rsyserr(FERROR_XFER, errno, "%s %s failed", @@ -473,6 +473,10 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, full_fname(fname)); goto cleanup; } + if (uid == (uid_t)-1 && sxp->st.st_uid != (uid_t)-1) + rprintf(FERROR_XFER, "uid 4294967295 (-1) is impossible to set on %s\n", full_fname(fname)); + if (gid == (gid_t)-1 && sxp->st.st_gid != (gid_t)-1) + rprintf(FERROR_XFER, "gid 4294967295 (-1) is impossible to set on %s\n", full_fname(fname)); /* A lchown had been done, so we need to re-stat if * the destination had the setuid or setgid bits set * (due to the side effect of the chown call). */ diff --git a/uidlist.c b/uidlist.c index dd26a55..e43ae5c 100644 --- a/uidlist.c +++ b/uidlist.c @@ -39,8 +39,6 @@ extern int numeric_ids; # endif #endif -#define GID_NONE ((gid_t)-1) - struct idlist { struct idlist *next; const char *name; @@ -103,12 +101,12 @@ static gid_t map_gid(gid_t id, const char *name) static int is_in_group(gid_t gid) { #ifdef HAVE_GETGROUPS - static gid_t last_in = GID_NONE, last_out; - static int ngroups = -2; + static gid_t last_in; + static int ngroups = -2, last_out = -1; static GETGROUPS_T *gidset; int n; - if (gid == last_in) + if (gid == last_in && last_out >= 0) return last_out; if (ngroups < -1) { gid_t mygid = MY_GID(); -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs