diff options
author | Matt McCutchen <matt@mattmccutchen.net> | 2011-01-29 19:25:53 -0800 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2011-01-29 22:05:16 -0800 |
commit | 57edc4808f566fbaa58ec96bc7e543b1ccb92ab9 (patch) | |
tree | f7f1f16efa8a3c9d809686196d47cf6400db6669 /generator.c | |
parent | 69be312b5e335430e3e896e200def6a7c6f89c8d (diff) | |
download | android_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.c | 11 |
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 |