X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/53dd3135f13728fbcfce4c85773d9fc97cfce714..ad517ce5b33eb59873ec8468af704f43867cd8cb:/receiver.c diff --git a/receiver.c b/receiver.c index e7a164b9..816d69fd 100644 --- a/receiver.c +++ b/receiver.c @@ -83,7 +83,7 @@ static void add_delete_entry(struct file_struct *file) static void delete_one(struct file_struct *f) { if (!S_ISDIR(f->mode)) { - if (do_unlink(f_name(f)) != 0) { + if (robust_unlink(f_name(f)) != 0) { rprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno)); } else if (verbose) { rprintf(FINFO,"deleting %s\n",f_name(f)); @@ -412,17 +412,19 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) setuid/setgid bits to ensure that there is no race condition. They are then correctly updated after the lchown. Thanks to snabb@epipe.fi for pointing - this out */ + this out. We also set it initially without group + access because of a similar race condition. */ fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL, - file->mode & ACCESSPERMS); + file->mode & INITACCESSPERMS); - if (fd2 == -1 && relative_paths && errno == ENOENT && + if (fd2 == -1 && errno == ENOENT && + (relative_paths || (compare_dest != NULL)) && create_directory_path(fnametmp) == 0) { fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL, - file->mode & ACCESSPERMS); + file->mode & INITACCESSPERMS); } if (fd2 == -1) { - rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno)); + rprintf(FERROR,"cannot create %s : %s\n",fnametmp,strerror(errno)); receive_data(f_in,buf,-1,NULL,file->length); if (buf) unmap_file(buf); if (fd1 != -1) close(fd1);