From d966ee254a2cc44158bb070c6df0a61a808cbc44 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 16 Dec 1997 17:59:49 +0000 Subject: [PATCH] fixed a nasty bug in the handling of the --delete option when there are duplicate file names in the list of files to be transferred (eg. the user specifies the same file twice). --- flist.c | 42 ++++++++++++++++++++++++++++-------------- rsync.c | 4 ++-- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/flist.c b/flist.c index b21618df..b333b5be 100644 --- a/flist.c +++ b/flist.c @@ -560,22 +560,36 @@ int file_compare(struct file_struct *f1,struct file_struct *f2) } +/* we need this function because of the silly way in which duplicate + entries are handled in the file lists - we can't change this + without breaking existing versions */ +static int flist_up(struct file_list *flist, int i) +{ + while (!flist->files[i].name) i++; + return i; +} + + int flist_find(struct file_list *flist,struct file_struct *f) { - int low=0,high=flist->count-1; - - while (low != high) { - int mid = (low+high)/2; - int ret = file_compare(&flist->files[mid],f); - if (ret == 0) return mid; - if (ret > 0) - high=mid; - else - low=mid+1; - } - if (file_compare(&flist->files[low],f) == 0) - return low; - return -1; + int low=0,high=flist->count-1; + + if (flist->count <= 0) return -1; + + while (low != high) { + int mid = (low+high)/2; + int ret = file_compare(&flist->files[flist_up(flist, mid)],f); + if (ret == 0) return flist_up(flist, mid); + if (ret > 0) { + high=mid; + } else { + low=mid+1; + } + } + + if (file_compare(&flist->files[flist_up(flist,low)],f) == 0) + return flist_up(flist,low); + return -1; } diff --git a/rsync.c b/rsync.c index 38bbdcde..f961a5dd 100644 --- a/rsync.c +++ b/rsync.c @@ -548,10 +548,10 @@ static void delete_files(struct file_list *flist) strncmp(flist->files[j].name,last_name, strlen(last_name))==0) continue; last_name = flist->files[j].name; + if (!(local_file_list = send_file_list(-1,1,&last_name))) + continue; if (verbose > 1) fprintf(FINFO,"deleting in %s\n", last_name); - if (!(local_file_list = send_file_list(-1,1,&last_name))) - return; for (i=local_file_list->count-1;i>=0;i--) { if (!local_file_list->files[i].name) continue; -- 2.34.1