[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-tar] [PATCH] Bugfix - fix xattr exclude/include for archive cre
From: |
Pavel Raiskup |
Subject: |
Re: [Bug-tar] [PATCH] Bugfix - fix xattr exclude/include for archive create |
Date: |
Mon, 30 May 2016 09:10:18 +0200 |
User-agent: |
KMail/4.14.10 (Linux/4.4.9-300.fc23.x86_64; KDE/4.14.20; x86_64; ; ) |
Hi Ian,
On Sunday 29 of May 2016 16:20:00 Ian McLeod wrote:
> * src/xattrs.c (xattrs_xattrs_get): apply exclude/include mask when
> fetching extended attributes
>
> 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.
Good catch, exclude/include is ignored during archive creation.
Could you please post smaller patch just having the important part:
+ if (!xattrs_masked_out(attr, true /* archiving */))
+ xheader_xattr_add (st, attr, val, aret);
(+ one prototype above). And could you please add one new testcase for
--xattrs-{exclude,include}?
Thanks!
Pavel
> ---
> src/xattrs.c | 103
> ++++++++++++++++++++++++++++++-----------------------------
> 1 file changed, 53 insertions(+), 50 deletions(-)
>
> diff --git a/src/xattrs.c b/src/xattrs.c
> index 8e56168..a272af7 100644
> --- a/src/xattrs.c
> +++ b/src/xattrs.c
> @@ -434,8 +434,55 @@ 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_matches_mask (const char *kw, struct xattrs_mask_map *mm)
> +{
> + int i;
> +
> + if (!mm->size)
> + return false;
> +
> + for (i = 0; i < mm->used; i++)
> + if (fnmatch (mm->masks[i], kw, 0) == 0)
> + return true;
> +
> + return false;
> +}
> +
> +#define USER_DOT_PFX "user."
> +
> +static bool
> +xattrs_kw_included (const char *kw, bool archiving)
> +{
> + if (xattrs_setup.incl.size)
> + return xattrs_matches_mask (kw, &xattrs_setup.incl);
> + else if (archiving)
> + return true;
> + else
> + return strncmp (kw, USER_DOT_PFX, sizeof (USER_DOT_PFX) - 1) == 0;
> +}
> +
> +static bool
> +xattrs_kw_excluded (const char *kw, bool archiving)
> +{
> + return xattrs_setup.excl.size ?
> + xattrs_matches_mask (kw, &xattrs_setup.excl) : false;
> +}
> +
> +/* Check whether the xattr with keyword KW should be discarded from list of
> + attributes that are going to be archived/excluded (set ARCHIVING=true for
> + archiving, false for excluding) */
> +static bool
> +xattrs_masked_out (const char *kw, bool archiving)
> +{
> + return xattrs_kw_included (kw, archiving) ?
> + xattrs_kw_excluded (kw, archiving) : true;
> +}
> +
> +/* 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 +527,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 +537,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);
> @@ -595,51 +643,6 @@ xattrs_selinux_set (struct tar_stat_info const *st,
> }
> }
>
> -static bool
> -xattrs_matches_mask (const char *kw, struct xattrs_mask_map *mm)
> -{
> - int i;
> -
> - if (!mm->size)
> - return false;
> -
> - for (i = 0; i < mm->used; i++)
> - if (fnmatch (mm->masks[i], kw, 0) == 0)
> - return true;
> -
> - return false;
> -}
> -
> -#define USER_DOT_PFX "user."
> -
> -static bool
> -xattrs_kw_included (const char *kw, bool archiving)
> -{
> - if (xattrs_setup.incl.size)
> - return xattrs_matches_mask (kw, &xattrs_setup.incl);
> - else if (archiving)
> - return true;
> - else
> - return strncmp (kw, USER_DOT_PFX, sizeof (USER_DOT_PFX) - 1) == 0;
> -}
> -
> -static bool
> -xattrs_kw_excluded (const char *kw, bool archiving)
> -{
> - return xattrs_setup.excl.size ?
> - xattrs_matches_mask (kw, &xattrs_setup.excl) : false;
> -}
> -
> -/* Check whether the xattr with keyword KW should be discarded from list of
> - attributes that are going to be archived/excluded (set ARCHIVING=true for
> - archiving, false for excluding) */
> -static bool
> -xattrs_masked_out (const char *kw, bool archiving)
> -{
> - return xattrs_kw_included (kw, archiving) ?
> - xattrs_kw_excluded (kw, archiving) : true;
> -}
> -
> void
> xattrs_xattrs_set (struct tar_stat_info const *st,
> char const *file_name, char typeflag, int later_run)
>