diff options
author | Ian McLeod <imcleod@redhat.com> | 2016-05-30 17:11:35 -0500 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-11-10 10:02:31 +0200 |
commit | bb6ddd8e04c9a7a7aa2f60b250f978e5117d3d69 (patch) | |
tree | b489e1ad56d5eeb7b3a44dcbfdb3aa4308c179c6 /src/xattrs.c | |
parent | 7340f67b9860ea0531c1450e5aa261c50f67165d (diff) | |
download | tar-bb6ddd8e04c9a7a7aa2f60b250f978e5117d3d69.tar.gz |
Bugfix - fix xattr exclude/include for archive create
This makes archive create behavior consistent with the
documentation. Without this change xattr include/exclude options
are accepted when creating an archive but are silently ignored.
* src/xattrs.c (xattrs_xattrs_get): Apply exclude/include mask
when fetching extended attributes
* tests/Makefile.am: Add new test case.
* tests/testsuite.at: Likewise.
Diffstat (limited to 'src/xattrs.c')
-rw-r--r-- | src/xattrs.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/xattrs.c b/src/xattrs.c index 8e561680..655dd437 100644 --- a/src/xattrs.c +++ b/src/xattrs.c @@ -434,8 +434,12 @@ xattrs_clear_setup (void) clear_mask_map (&xattrs_setup.excl); } -/* get all xattrs from file given by FILE_NAME or FD (when non-zero). This - includes all the user.*, security.*, system.*, etc. available domains */ +static bool xattrs_masked_out (const char *kw, bool archiving); + +/* get xattrs from file given by FILE_NAME or FD (when non-zero) + xattrs are checked against the user supplied include/exclude mask + if no mask is given this includes all the user.*, security.*, system.*, + etc. available domains */ void xattrs_xattrs_get (int parentfd, char const *file_name, struct tar_stat_info *st, int fd) @@ -480,8 +484,6 @@ xattrs_xattrs_get (int parentfd, char const *file_name, size_t len = strlen (attr); ssize_t aret = 0; - /* Archive all xattrs during creation, decide at extraction time - * which ones are of interest/use for the target filesystem. */ while (((fd == 0) ? ((aret = lgetxattrat (parentfd, file_name, attr, val, asz)) == -1) @@ -492,7 +494,10 @@ xattrs_xattrs_get (int parentfd, char const *file_name, } if (aret != -1) - xheader_xattr_add (st, attr, val, aret); + { + if (!xattrs_masked_out(attr, true)) + xheader_xattr_add (st, attr, val, aret); + } else if (errno != ENOATTR) call_arg_warn ((fd == 0) ? "lgetxattrat" : "fgetxattr", file_name); |