From 667e72a1956cea3c144036432eaa923a5a62bba9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 18 Jun 1998 09:36:24 +0000 Subject: [PATCH] change the order of chmod and chown calls so that setuid bits don't get removed by chown calls. --- rsync.c | 105 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/rsync.c b/rsync.c index beb3d37f..00c6beb5 100644 --- a/rsync.c +++ b/rsync.c @@ -267,65 +267,66 @@ static struct sum_struct *receive_sums(int f) static int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st, int report) { - int updated = 0; - STRUCT_STAT st2; - extern int am_daemon; + int updated = 0; + STRUCT_STAT st2; + extern int am_daemon; - if (dry_run) return 0; + if (dry_run) return 0; - if (!st) { - if (link_stat(fname,&st2) != 0) { - rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno)); - return 0; - } - st = &st2; - } + if (!st) { + if (link_stat(fname,&st2) != 0) { + rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno)); + return 0; + } + st = &st2; + } - if (preserve_times && !S_ISLNK(st->st_mode) && - st->st_mtime != file->modtime) { - updated = 1; - if (set_modtime(fname,file->modtime) != 0) { - rprintf(FERROR,"failed to set times on %s : %s\n", - fname,strerror(errno)); - return 0; - } - } + if (preserve_times && !S_ISLNK(st->st_mode) && + st->st_mtime != file->modtime) { + updated = 1; + if (set_modtime(fname,file->modtime) != 0) { + rprintf(FERROR,"failed to set times on %s : %s\n", + fname,strerror(errno)); + return 0; + } + } + + if ((am_root || !am_daemon) && + ((am_root && preserve_uid && st->st_uid != file->uid) || + (preserve_gid && st->st_gid != file->gid))) { + if (do_lchown(fname, + (am_root&&preserve_uid)?file->uid:-1, + preserve_gid?file->gid:-1) != 0) { + if (preserve_uid && st->st_uid != file->uid) + updated = 1; + if (verbose>1 || preserve_uid) { + rprintf(FERROR,"chown %s : %s\n", + fname,strerror(errno)); + return 0; + } + } + updated = 1; + } #ifdef HAVE_CHMOD - if (preserve_perms && !S_ISLNK(st->st_mode) && - st->st_mode != file->mode) { - updated = 1; - if (do_chmod(fname,file->mode) != 0) { - rprintf(FERROR,"failed to set permissions on %s : %s\n", - fname,strerror(errno)); - return 0; - } - } + if (preserve_perms && !S_ISLNK(st->st_mode) && + st->st_mode != file->mode) { + updated = 1; + if (do_chmod(fname,file->mode) != 0) { + rprintf(FERROR,"failed to set permissions on %s : %s\n", + fname,strerror(errno)); + return 0; + } + } #endif - - if ((am_root || !am_daemon) && - ((am_root && preserve_uid && st->st_uid != file->uid) || - (preserve_gid && st->st_gid != file->gid))) { - if (do_lchown(fname, - (am_root&&preserve_uid)?file->uid:-1, - preserve_gid?file->gid:-1) != 0) { - if (preserve_uid && st->st_uid != file->uid) - updated = 1; - if (verbose>1 || preserve_uid) - rprintf(FERROR,"chown %s : %s\n", - fname,strerror(errno)); - return updated; - } - updated = 1; - } - if (verbose > 1 && report) { - if (updated) - rprintf(FINFO,"%s\n",fname); - else - rprintf(FINFO,"%s is uptodate\n",fname); - } - return updated; + if (verbose > 1 && report) { + if (updated) + rprintf(FINFO,"%s\n",fname); + else + rprintf(FINFO,"%s is uptodate\n",fname); + } + return updated; } -- 2.34.1