aboutsummaryrefslogtreecommitdiffstats
path: root/generator.c
diff options
context:
space:
mode:
authorMatt McCutchen <matt@mattmccutchen.net>2011-01-29 19:25:53 -0800
committerWayne Davison <wayned@samba.org>2011-01-29 22:05:16 -0800
commit57edc4808f566fbaa58ec96bc7e543b1ccb92ab9 (patch)
treef7f1f16efa8a3c9d809686196d47cf6400db6669 /generator.c
parent69be312b5e335430e3e896e200def6a7c6f89c8d (diff)
downloadandroid_external_rsync-57edc4808f566fbaa58ec96bc7e543b1ccb92ab9.tar.gz
android_external_rsync-57edc4808f566fbaa58ec96bc7e543b1ccb92ab9.tar.bz2
android_external_rsync-57edc4808f566fbaa58ec96bc7e543b1ccb92ab9.zip
Avoid changing file_extra_cnt during deletion.
The I/O code can receive incremental file-list chunks during deletion, and their OPT_EXTRA fields would get corrupted when file_extra_cnt is incremented. Instead of temporarily enabling uid_ndx to find out whether the user owns a file, have make_file() set a flag for that purpose. Applied with a few minor tweaks by Wayne. Fixes bug 7936.
Diffstat (limited to 'generator.c')
-rw-r--r--generator.c11
1 files changed, 1 insertions, 10 deletions
diff --git a/generator.c b/generator.c
index f2c4233e..d17e3b9e 100644
--- a/generator.c
+++ b/generator.c
@@ -276,7 +276,6 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
struct file_list *dirlist;
char delbuf[MAXPATHLEN];
int dlen, i;
- int save_uid_ndx = uid_ndx;
if (!fbuf) {
change_local_filter_dir(NULL, 0, 0);
@@ -308,9 +307,6 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
return;
}
- if (!uid_ndx)
- uid_ndx = ++file_extra_cnt;
-
dirlist = get_dirlist(fbuf, dlen, 0);
/* If an item in dirlist is not found in flist, delete it
@@ -330,7 +326,7 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
* a delete_item call with a DEL_MAKE_ROOM flag. */
if (flist_find_ignore_dirness(cur_flist, fp) < 0) {
int flags = DEL_RECURSE;
- if (!(fp->mode & S_IWUSR) && !am_root && (uid_t)F_OWNER(fp) == our_uid)
+ if (!(fp->mode & S_IWUSR) && !am_root && fp->flags & FLAG_OWNED_BY_US)
flags |= DEL_NO_UID_WRITE;
f_name(fp, delbuf);
if (delete_during == 2) {
@@ -342,11 +338,6 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
}
flist_free(dirlist);
-
- if (!save_uid_ndx) {
- --file_extra_cnt;
- uid_ndx = 0;
- }
}
/* This deletes any files on the receiving side that are not present on the