summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-08-28 16:02:12 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-08-28 17:40:57 +0300
commita339f05cd269013fa133d2f148d73f6f7d4247e4 (patch)
treec6a32f0b64a6c063a2d48f58ef94113dc0ee3e83
parentcc8f5f78b2437f50f0972433275b910b10d46717 (diff)
downloadtar-a339f05cd269013fa133d2f148d73f6f7d4247e4.tar.gz
Fix handling of extended header prefixes
* src/xheader.c (locate_handler): Recognize prefix keywords only when followed by a dot. (xattr_decoder): Use xmalloc/xstrdup instead of alloc
-rw-r--r--src/xheader.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/xheader.c b/src/xheader.c
index 4f8b2b27..3cd694d1 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -637,11 +637,11 @@ static struct xhdr_tab const *
locate_handler (char const *keyword)
{
struct xhdr_tab const *p;
-
for (p = xhdr_tab; p->keyword; p++)
if (p->prefix)
{
- if (strncmp (p->keyword, keyword, strlen(p->keyword)) == 0)
+ size_t kwlen = strlen (p->keyword);
+ if (keyword[kwlen] == '.' && strncmp (p->keyword, keyword, kwlen) == 0)
return p;
}
else
@@ -1716,19 +1716,20 @@ xattr_decoder (struct tar_stat_info *st,
char const *keyword, char const *arg, size_t size)
{
char *xstr, *xkey;
-
+
/* copy keyword */
- size_t klen_raw = strlen (keyword);
- xkey = alloca (klen_raw + 1);
- memcpy (xkey, keyword, klen_raw + 1) /* including null-terminating */;
+ xkey = xstrdup (keyword);
/* copy value */
- xstr = alloca (size + 1);
+ xstr = xmalloc (size + 1);
memcpy (xstr, arg, size + 1); /* separator included, for GNU tar '\n' */;
xattr_decode_keyword (xkey);
- xheader_xattr_add (st, xkey + strlen("SCHILY.xattr."), xstr, size);
+ xheader_xattr_add (st, xkey + strlen ("SCHILY.xattr."), xstr, size);
+
+ free (xkey);
+ free (xstr);
}
static void