From 6957ae33a931950d03cbba0d0cb78be1920f26f3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 24 Jan 2000 11:20:25 +0000 Subject: [PATCH] moved file deletion to before the fork() to prevent a race condition pointed out by byrnes@curl.com --- main.c | 10 ++++++++++ receiver.c | 8 +------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/main.c b/main.c index 6ea93218..a5467782 100644 --- a/main.c +++ b/main.c @@ -280,10 +280,20 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) int recv_pipe[2]; int error_pipe[2]; extern int preserve_hard_links; + extern int delete_after; + extern int recurse; + extern int delete_mode; if (preserve_hard_links) init_hard_links(flist); + if (!delete_after) { + /* I moved this here from recv_files() to prevent a race condition */ + if (recurse && delete_mode && !local_name && flist->count>0) { + delete_files(flist); + } + } + if (pipe(recv_pipe) < 0) { rprintf(FERROR,"pipe failed in do_recv\n"); exit_cleanup(RERR_SOCKETIO); diff --git a/receiver.c b/receiver.c index 20afb4fb..6647c68a 100644 --- a/receiver.c +++ b/receiver.c @@ -102,7 +102,7 @@ static void delete_one(struct file_struct *f) /* this deletes any files on the receiving side that are not present on the sending side. For version 1.6.4 I have changed the behaviour to match more closely what most people seem to expect of this option */ -static void delete_files(struct file_list *flist) +void delete_files(struct file_list *flist) { struct file_list *local_file_list; int i, j; @@ -316,12 +316,6 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) rprintf(FINFO,"recv_files(%d) starting\n",flist->count); } - if (!delete_after) { - if (recurse && delete_mode && !local_name && flist->count>0) { - delete_files(flist); - } - } - while (1) { cleanup_disable(); -- 2.34.1