/* Interface functions to obstacks */
static void
-x_obstack_grow (struct xheader *xhdr, const char *ptr, size_t length)
+x_obstack_grow (struct xheader *xhdr, const char *ptr, idx_t length)
{
obstack_grow (xhdr->stk, ptr, length);
xhdr->size += length;
}
static void
-x_obstack_blank (struct xheader *xhdr, size_t length)
+x_obstack_blank (struct xheader *xhdr, idx_t length)
{
obstack_blank (xhdr->stk, length);
xhdr->size += length;
xheader_format_name (struct tar_stat_info *st, const char *fmt, intmax_t n)
{
char *buf;
- size_t len;
char *q;
const char *p;
char *dirp = NULL;
char nbuf[INTMAX_STRSIZE_BOUND];
char const *nptr = NULL;
- len = 0;
+ idx_t len = 0;
for (p = fmt; *p; p++)
{
if (*p == '%' && p[1])
{
if (!globexthdr_name)
{
- size_t len;
const char *global_header_template
= header_template[pax_global_header][posixly_correct];
const char *tmp = getenv ("TMPDIR");
if (!tmp)
tmp = "/tmp";
- len = strlen (tmp) + strlen (global_header_template) + 1;
- globexthdr_name = xmalloc (len);
- strcpy(globexthdr_name, tmp);
- strcat(globexthdr_name, global_header_template);
+ idx_t tmplen = strlen (tmp);
+ idx_t templatesize = strlen (global_header_template) + 1;
+ globexthdr_name = ximalloc (tmplen + templatesize);
+ char *p = mempcpy (globexthdr_name, tmp, tmplen);
+ memcpy (p, global_header_template, templatesize);
}
return xheader_format_name (NULL, globexthdr_name, global_header_count + 1);
void
xheader_write (char type, char *name, time_t t, struct xheader *xhdr)
{
- union block *header;
- size_t size;
- char *p;
-
- size = xhdr->size;
+ idx_t size = xhdr->size;
switch (type)
{
case XGLTYPE:
t = exthdr_mtime;
break;
}
- header = start_private_header (name, size, t);
+ union block *header = start_private_header (name, size, t);
header->header.typeflag = type;
simple_finish_header (header);
- p = xhdr->buffer;
+ char *p = xhdr->buffer;
do
{
- size_t len;
-
header = find_next_block ();
- len = BLOCKSIZE;
- if (len > size)
- len = size;
+ idx_t len = min (size, BLOCKSIZE);
memcpy (header->buffer, p, len);
if (len < BLOCKSIZE)
memset (header->buffer + len, 0, BLOCKSIZE - len);
char const *keyword;
void (*coder) (struct tar_stat_info const *, char const *,
struct xheader *, void const *data);
- void (*decoder) (struct tar_stat_info *, char const *, char const *, size_t);
+ void (*decoder) (struct tar_stat_info *, char const *, char const *, idx_t);
int flags;
bool prefix; /* select handler comparing prefix only */
};
for (p = xhdr_tab; p->keyword; p++)
if (p->prefix)
{
- size_t kwlen = strlen (p->keyword);
+ idx_t kwlen = strlen (p->keyword);
if (strncmp (p->keyword, keyword, kwlen) == 0 && keyword[kwlen] == '.')
return p;
}
static bool
decode_record (struct xheader *xhdr,
char **ptr,
- void (*handler) (void *, char const *, char const *, size_t),
+ void (*handler) (void *, char const *, char const *, idx_t),
void *data)
{
char *start = *ptr;
}
static void
-decx (void *data, char const *keyword, char const *value, size_t size)
+decx (void *data, char const *keyword, char const *value, idx_t size)
{
struct xhdr_tab const *t;
struct tar_stat_info *st = data;
static void
decg (void *data, char const *keyword, char const *value,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
struct keyword_list **kwl = data;
struct xhdr_tab const *tab = locate_handler (keyword);
void
xheader_read (struct xheader *xhdr, union block *p, off_t size)
{
- size_t j = 0;
+ idx_t j = 0;
if (size < 0)
size = 0; /* Already diagnosed. */
- size_t size_plus_1;
+ idx_t size_plus_1;
if (ckd_add (&size_plus_1, size, BLOCKSIZE + 1))
xalloc_die ();
size = size_plus_1 - 1;
do
{
- size_t len = size;
-
- if (len > BLOCKSIZE)
- len = BLOCKSIZE;
-
if (!p)
paxfatal (0, _("Unexpected EOF in archive"));
+ idx_t len = min (size, BLOCKSIZE);
memcpy (&xhdr->buffer[j], p->buffer, len);
set_next_block_after (p);
(http://lists.gnu.org/archive/html/bug-tar/2012-10/msg00017.html)
*/
static char *
-xattr_encode_keyword(const char *keyword)
+xattr_encode_keyword (char const *keyword)
{
static char *encode_buffer = NULL;
- static size_t encode_buffer_size = 0;
- size_t bp; /* keyword/buffer pointers */
-
- if (!encode_buffer)
- {
- encode_buffer_size = 256;
- encode_buffer = xmalloc (encode_buffer_size);
- }
- else
- *encode_buffer = 0;
+ static idx_t encode_buffer_size = 0;
- for (bp = 0; *keyword != 0; ++bp, ++keyword)
+ for (idx_t bp = 0; ; )
{
- char c = *keyword;
-
- if (bp + 3 /* enough for URL encoding also.. */ >= encode_buffer_size)
- {
- encode_buffer = x2realloc (encode_buffer, &encode_buffer_size);
- }
+ if (encode_buffer_size < bp + 3 /* enough for URL encoding also.. */)
+ encode_buffer = xpalloc (encode_buffer, &encode_buffer_size, 3, -1, 1);
- if (c == '%')
- {
- strcpy (encode_buffer + bp, "%25");
- bp += 2;
- }
- else if (c == '=')
- {
- strcpy (encode_buffer + bp, "%3D");
- bp += 2;
- }
- else
- encode_buffer[bp] = c;
+ char c = *keyword++;
+ switch (c)
+ {
+ case '%':
+ memcpy (encode_buffer + bp, "%25", 3);
+ bp += 3;
+ break;
+
+ case '=':
+ memcpy (encode_buffer + bp, "%3D", 3);
+ bp += 3;
+ break;
+
+ default:
+ encode_buffer[bp++] = c;
+ if (!c)
+ return encode_buffer;
+ break;
+ }
}
-
- encode_buffer[bp] = 0;
-
- return encode_buffer;
}
static void
xheader_print_n (struct xheader *xhdr, char const *keyword,
- char const *value, size_t vsize)
+ char const *value, idx_t vsize)
{
- size_t p;
- size_t n = 0;
- char nbuf[UINTMAX_STRSIZE_BOUND];
+ idx_t p;
+ idx_t n = 0;
+ char nbuf[INTMAX_STRSIZE_BOUND];
char const *np;
- size_t len, klen;
keyword = xattr_encode_keyword (keyword);
- klen = strlen (keyword);
- len = klen + vsize + 3; /* ' ' + '=' + '\n' */
+ idx_t klen = strlen (keyword);
+ idx_t len = klen + vsize + 3; /* ' ' + '=' + '\n' */
do
{
p = n;
- np = umaxtostr (len + p, nbuf);
+ np = imaxtostr (len + p, nbuf);
n = nbuf + sizeof nbuf - 1 - np;
}
while (n != p);
uintmax_t len;
uintmax_t p;
uintmax_t n = 0;
- size_t size;
char nbuf[UINTMAX_STRSIZE_BOUND];
char const *np;
char *cp;
while (n != p);
p = strlen (keyword) + n + 2;
- size = p;
+ idx_t size = p;
if (size != p)
{
paxerror (0,
dummy_decoder (MAYBE_UNUSED struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
MAYBE_UNUSED char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
}
atime_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
struct timespec ts;
if (decode_time (&ts, arg, keyword))
gid_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
intmax_t u;
if (decode_signed_num (&u, arg, TYPE_MINIMUM (gid_t),
gname_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
decode_string (&st->gname, arg);
}
linkpath_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
decode_string (&st->link_name, arg);
}
ctime_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
struct timespec ts;
if (decode_time (&ts, arg, keyword))
mtime_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
struct timespec ts;
if (decode_time (&ts, arg, keyword))
path_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
if (! st->sparse_name_done)
raw_path_decoder (st, arg);
sparse_path_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
st->sparse_name_done = true;
raw_path_decoder (st, arg);
size_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
uid_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
intmax_t u;
if (decode_signed_num (&u, arg, TYPE_MINIMUM (uid_t),
uname_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
decode_string (&st->uname, arg);
}
sparse_size_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
sparse_numblocks_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, SIZE_MAX, keyword))
sparse_offset_coder (struct tar_stat_info const *st, char const *keyword,
struct xheader *xhdr, void const *data)
{
- size_t const *pi = data;
+ idx_t const *pi = data;
code_num (st->sparse_map[*pi].offset, keyword, xhdr);
}
sparse_offset_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
sparse_numbytes_coder (struct tar_stat_info const *st, char const *keyword,
struct xheader *xhdr, void const *data)
{
- size_t const *pi = data;
+ idx_t const *pi = data;
code_num (st->sparse_map[*pi].numbytes, keyword, xhdr);
}
sparse_numbytes_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), keyword))
sparse_map_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
bool offset = true;
struct sp_array e;
dumpdir_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- size_t size)
+ idx_t size)
{
- st->dumpdir = xmalloc (size);
+ st->dumpdir = ximalloc (size);
memcpy (st->dumpdir, arg, size);
}
volume_label_decoder (MAYBE_UNUSED struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
decode_string (&volume_label, arg);
}
static void
volume_size_decoder (MAYBE_UNUSED struct tar_stat_info *st,
char const *keyword,
- char const *arg, MAYBE_UNUSED size_t size)
+ char const *arg, MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (uintmax_t), keyword))
static void
volume_offset_decoder (MAYBE_UNUSED struct tar_stat_info *st,
char const *keyword,
- char const *arg, MAYBE_UNUSED size_t size)
+ char const *arg, MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, TYPE_MAXIMUM (uintmax_t), keyword))
volume_filename_decoder (MAYBE_UNUSED struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
decode_string (&continued_file_name, arg);
}
static void
xattr_selinux_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword, char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
decode_string (&st->cntx_name, arg);
}
static void
xattr_acls_a_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword,
- char const *arg, size_t size)
+ char const *arg, idx_t size)
{
st->acls_a_ptr = xmemdup (arg, size + 1);
st->acls_a_len = size;
static void
xattr_acls_d_decoder (struct tar_stat_info *st,
MAYBE_UNUSED char const *keyword, char const *arg,
- size_t size)
+ idx_t size)
{
st->acls_d_ptr = xmemdup (arg, size + 1);
st->acls_d_len = size;
xattr_coder (struct tar_stat_info const *st, char const *keyword,
struct xheader *xhdr, void const *data)
{
- size_t n = *(size_t *)data;
+ idx_t const *idx_data = data;
+ idx_t n = *idx_data;
xheader_print_n (xhdr, keyword,
st->xattr_map.xm_map[n].xval_ptr,
st->xattr_map.xm_map[n].xval_len);
static void
xattr_decoder (struct tar_stat_info *st,
- char const *keyword, char const *arg, size_t size)
+ char const *keyword, char const *arg, idx_t size)
{
char *xkey;
sparse_major_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, INTMAX_MAX, keyword))
sparse_minor_decoder (struct tar_stat_info *st,
char const *keyword,
char const *arg,
- MAYBE_UNUSED size_t size)
+ MAYBE_UNUSED idx_t size)
{
uintmax_t u;
if (decode_num (&u, arg, INTMAX_MAX, keyword))