summaryrefslogtreecommitdiff
path: root/src/xattrs.c
diff options
context:
space:
mode:
authorIan McLeod <imcleod@redhat.com>2016-05-30 17:11:35 -0500
committerSergey Poznyakoff <gray@gnu.org.ua>2016-11-10 10:02:31 +0200
commitbb6ddd8e04c9a7a7aa2f60b250f978e5117d3d69 (patch)
treeb489e1ad56d5eeb7b3a44dcbfdb3aa4308c179c6 /src/xattrs.c
parent7340f67b9860ea0531c1450e5aa261c50f67165d (diff)
downloadtar-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.c15
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);