aboutsummaryrefslogtreecommitdiffstats
path: root/xattrs.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2009-04-10 16:22:44 -0700
committerWayne Davison <wayned@samba.org>2009-04-10 16:22:44 -0700
commitcb197514d99d17dc3a1ce26ff8918d63307d75e4 (patch)
treeb92675696b2098f54d46c0fec4383897acfb184d /xattrs.c
parenta055dbdd883a3c04318e13211c3ef7942314bee7 (diff)
downloadandroid_external_rsync-cb197514d99d17dc3a1ce26ff8918d63307d75e4.tar.gz
android_external_rsync-cb197514d99d17dc3a1ce26ff8918d63307d75e4.tar.bz2
android_external_rsync-cb197514d99d17dc3a1ce26ff8918d63307d75e4.zip
Fixed an ACL/xattr corruption issue where the --backup option could cause
rsync to associate the wrong ACL/xattr information with received files.
Diffstat (limited to 'xattrs.c')
-rw-r--r--xattrs.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/xattrs.c b/xattrs.c
index 2d0e050e..b9034751 100644
--- a/xattrs.c
+++ b/xattrs.c
@@ -82,6 +82,8 @@ static char *namebuf = NULL;
static item_list empty_xattr = EMPTY_ITEM_LIST;
static item_list rsync_xal_l = EMPTY_ITEM_LIST;
+static size_t prior_xattr_count = (size_t)-1;
+
/* ------------------------------------------------------------------------- */
static void rsync_xal_free(item_list *xalp)
@@ -725,13 +727,15 @@ void receive_xattr(struct file_struct *file, int f)
/* Turn the xattr data in stat_x into cached xattr data, setting the index
* values in the file struct. */
-void cache_xattr(struct file_struct *file, stat_x *sxp)
+void cache_tmp_xattr(struct file_struct *file, stat_x *sxp)
{
int ndx;
if (!sxp->xattr)
return;
+ if (prior_xattr_count == (size_t)-1)
+ prior_xattr_count = rsync_xal_l.count;
ndx = find_matching_xattr(sxp->xattr);
if (ndx < 0)
rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */
@@ -739,6 +743,21 @@ void cache_xattr(struct file_struct *file, stat_x *sxp)
F_XATTR(file) = ndx;
}
+void uncache_tmp_xattrs(void)
+{
+ if (prior_xattr_count != (size_t)-1) {
+ item_list *xattr_item = rsync_xal_l.items;
+ item_list *xattr_start = xattr_item + prior_xattr_count;
+ xattr_item += rsync_xal_l.count;
+ rsync_xal_l.count = prior_xattr_count;
+ while (xattr_item-- > xattr_start) {
+ rsync_xal_free(xattr_item);
+ free(xattr_item);
+ }
+ prior_xattr_count = (size_t)-1;
+ }
+}
+
static int rsync_xal_set(const char *fname, item_list *xalp,
const char *fnamecmp, stat_x *sxp)
{