From 62c0c3a78076607b98c3b6199b6b0542609558b4 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sat, 24 Nov 2018 22:10:53 +0200 Subject: [PATCH] Fix parsing of ACLs Text returned by acl_to_text can contain comments (introduced by #). Strip comments and horizontal tabs prior to storing ACLs in PAX headers. * src/xattrs.c (xattrs_acls_cleanup): New function. (xattrs__acls_get_a,xattrs__acls_get_d): Use xattrs_acls_cleanup. --- src/xattrs.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/xattrs.c b/src/xattrs.c index d7e4701e..9e1ddb1d 100644 --- a/src/xattrs.c +++ b/src/xattrs.c @@ -246,13 +246,36 @@ xattrs__acls_set (struct tar_stat_info const *st, acl_free (acl); } +/* Cleanup textual representation of the ACL in VAL by eliminating tab + characters and comments */ +static void +xattrs_acls_cleanup (char *val, size_t *plen) +{ + char *p, *q; + + p = q = val + strcspn (val, "#\t"); + while (*q) + { + if (*q == '\t') + q++; + else if (*q == '#') + { + while (*q != '\n') + q++; + } + else + *p++ = *q++; + } + *plen = p - val; + *p++ = 0; +} + static void xattrs__acls_get_a (int parentfd, const char *file_name, struct tar_stat_info *st, char **ret_ptr, size_t * ret_len) { char *val = NULL; - ssize_t len; acl_t acl; if (!(acl = acl_get_file_at (parentfd, file_name, ACL_TYPE_ACCESS))) @@ -262,7 +285,7 @@ xattrs__acls_get_a (int parentfd, const char *file_name, return; } - val = acl_to_text (acl, &len); + val = acl_to_text (acl, NULL); acl_free (acl); if (!val) @@ -272,8 +295,7 @@ xattrs__acls_get_a (int parentfd, const char *file_name, } *ret_ptr = xstrdup (val); - *ret_len = len; - + xattrs_acls_cleanup (*ret_ptr, ret_len); acl_free (val); } @@ -284,7 +306,6 @@ xattrs__acls_get_d (int parentfd, char const *file_name, char **ret_ptr, size_t * ret_len) { char *val = NULL; - ssize_t len; acl_t acl; if (!(acl = acl_get_file_at (parentfd, file_name, ACL_TYPE_DEFAULT))) @@ -294,7 +315,7 @@ xattrs__acls_get_d (int parentfd, char const *file_name, return; } - val = acl_to_text (acl, &len); + val = acl_to_text (acl, NULL); acl_free (acl); if (!val) @@ -304,8 +325,7 @@ xattrs__acls_get_d (int parentfd, char const *file_name, } *ret_ptr = xstrdup (val); - *ret_len = len; - + xattrs_acls_cleanup (*ret_ptr, ret_len); acl_free (val); } #endif /* HAVE_POSIX_ACLS */ -- 2.11.4.GIT