Commit 315c2152 authored by Wayne Davison's avatar Wayne Davison

Initialize xattr data in a couple spots in the hlink code, which avoids

a crash when the xattr pointer's memory happens to start out non-zero.
Also fixed the itemizing of an alt-dest file's xattrs when hard-linking.
parent 6d301fa3
...@@ -30,6 +30,7 @@ extern int inc_recurse; ...@@ -30,6 +30,7 @@ extern int inc_recurse;
extern int do_xfers; extern int do_xfers;
extern int link_dest; extern int link_dest;
extern int preserve_acls; extern int preserve_acls;
extern int preserve_xattrs;
extern int make_backups; extern int make_backups;
extern int protocol_version; extern int protocol_version;
extern int remove_source_files; extern int remove_source_files;
...@@ -394,6 +395,9 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname, ...@@ -394,6 +395,9 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname,
int j = 0; int j = 0;
#ifdef SUPPORT_ACLS #ifdef SUPPORT_ACLS
alt_sx.acc_acl = alt_sx.def_acl = NULL; alt_sx.acc_acl = alt_sx.def_acl = NULL;
#endif
#ifdef SUPPORT_XATTRS
alt_sx.xattr = NULL;
#endif #endif
do { do {
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
...@@ -423,19 +427,37 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname, ...@@ -423,19 +427,37 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname,
sxp->st = alt_sx.st; sxp->st = alt_sx.st;
#ifdef SUPPORT_ACLS #ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode)) { if (preserve_acls && !S_ISLNK(file->mode)) {
if (!ACL_READY(*sxp)) free_acl(sxp);
if (!ACL_READY(alt_sx))
get_acl(cmpbuf, sxp); get_acl(cmpbuf, sxp);
else { else {
sxp->acc_acl = alt_sx.acc_acl; sxp->acc_acl = alt_sx.acc_acl;
sxp->def_acl = alt_sx.def_acl; sxp->def_acl = alt_sx.def_acl;
alt_sx.acc_acl = alt_sx.def_acl = NULL;
} }
} }
#endif #endif
} #ifdef SUPPORT_XATTRS
if (preserve_xattrs) {
free_xattr(sxp);
if (!XATTR_READY(alt_sx))
get_xattr(cmpbuf, sxp);
else {
sxp->xattr = alt_sx.xattr;
alt_sx.xattr = NULL;
}
}
#endif
} else {
#ifdef SUPPORT_ACLS #ifdef SUPPORT_ACLS
else if (preserve_acls) if (preserve_acls)
free_acl(&alt_sx); free_acl(&alt_sx);
#endif
#ifdef SUPPORT_XATTRS
if (preserve_xattrs)
free_xattr(&alt_sx);
#endif #endif
}
} }
if (maybe_hard_link(file, ndx, fname, statret, sxp, prev_name, &prev_st, if (maybe_hard_link(file, ndx, fname, statret, sxp, prev_name, &prev_st,
...@@ -502,6 +524,9 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx, ...@@ -502,6 +524,9 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx,
#ifdef SUPPORT_ACLS #ifdef SUPPORT_ACLS
prev_sx.acc_acl = prev_sx.def_acl = NULL; prev_sx.acc_acl = prev_sx.def_acl = NULL;
#endif #endif
#ifdef SUPPORT_XATTRS
prev_sx.xattr = NULL;
#endif
while ((ndx = prev_ndx) >= 0) { while ((ndx = prev_ndx) >= 0) {
int val; int val;
...@@ -517,6 +542,10 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx, ...@@ -517,6 +542,10 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx,
#ifdef SUPPORT_ACLS #ifdef SUPPORT_ACLS
if (preserve_acls) if (preserve_acls)
free_acl(&prev_sx); free_acl(&prev_sx);
#endif
#ifdef SUPPORT_XATTRS
if (preserve_xattrs)
free_xattr(&prev_sx);
#endif #endif
if (val < 0) if (val < 0)
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment