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.
This commit is contained in:
Ian McLeod
2016-05-30 17:11:35 -05:00
committed by Sergey Poznyakoff
parent 7340f67b98
commit bb6ddd8e04
4 changed files with 63 additions and 5 deletions

View File

@@ -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);

View File

@@ -246,6 +246,7 @@ TESTSUITE_AT = \
xattr03.at\
xattr04.at\
xattr05.at\
xattr06.at\
acls01.at\
acls02.at\
acls03.at\

View File

@@ -445,6 +445,7 @@ m4_include([xattr02.at])
m4_include([xattr03.at])
m4_include([xattr04.at])
m4_include([xattr05.at])
m4_include([xattr06.at])
m4_include([acls01.at])
m4_include([acls02.at])

51
tests/xattr06.at Normal file
View File

@@ -0,0 +1,51 @@
# Process this file with autom4te to create testsuite. -*- Autotest -*-
#
# Test suite for GNU tar.
# Copyright 2012-2014, 2016 Free Software Foundation, Inc.
# This file is part of GNU tar.
# GNU tar is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# GNU tar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Test description: Test for exclude of xattr during archive creation
#
# Relevant mailing list thread:
#
# http://lists.gnu.org/archive/html/bug-tar/2016-05/msg00031.html
AT_SETUP([xattrs: exclude xattrs on create ])
AT_KEYWORDS([xattrs xattr06])
AT_TAR_CHECK([
AT_XATTRS_PREREQ
mkdir dir
mkdir output
genfile --file dir/file
setfattr -n user.excludedxattr -v value dir/file
# exclude the attribute we just set
tar --xattrs --xattrs-exclude=user.excludedxattr -cf archive.tar -C dir .
tar --xattrs -xf archive.tar -C output
getfattr -d output/file | grep -v excludedxattr > without
getfattr -d output/file > with
# if they differ then the attribute is still present
diff without with
],
[0],
[])
AT_CLEANUP