diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-08-28 16:02:12 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-08-28 17:40:57 +0300 |
commit | a339f05cd269013fa133d2f148d73f6f7d4247e4 (patch) | |
tree | c6a32f0b64a6c063a2d48f58ef94113dc0ee3e83 /src | |
parent | cc8f5f78b2437f50f0972433275b910b10d46717 (diff) | |
download | tar-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
Diffstat (limited to 'src')
-rw-r--r-- | src/xheader.c | 17 |
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 |