summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-11-24 22:10:53 +0200
committerSergey Poznyakoff <gray@gnu.org>2018-11-24 22:10:53 +0200
commit62c0c3a78076607b98c3b6199b6b0542609558b4 (patch)
treef5e740e45d2875d8a7bb406f294efabc00f97372
parentba472050da0c91f23d475ba43f8e940058f27f20 (diff)
downloadtar-62c0c3a78076607b98c3b6199b6b0542609558b4.tar.gz
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.
-rw-r--r--src/xattrs.c36
1 files 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 */