]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Prefer idx_t to size_t in xheader.c
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 1 Nov 2024 16:40:36 +0000 (09:40 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 2 Nov 2024 06:47:23 +0000 (23:47 -0700)
* src/xheader.c (x_obstack_grow, x_obstack_blank)
(xheader_format_name, xheader_ghdr_name, xheader_write)
(struct xhdr_tab, locate_handler, decode_record, decx, decg)
(xheader_read, xattr_encode_keyword, xheader_print_n)
(xheader_string_end, dummy_decoder, atime_decoder, gid_decoder)
(gname_decoder, linkpath_decoder, ctime_decoder, mtime_decoder)
(path_decoder, sparse_path_decoder, size_decoder, uid_decoder)
(uname_decoder, sparse_size_decoder, sparse_numblocks_decoder)
(sparse_offset_coder, sparse_offset_decoder)
(sparse_numbytes_coder, sparse_numbytes_decoder)
(sparse_map_decoder, dumpdir_decoder, volume_label_decoder)
(volume_size_decoder, volume_offset_decoder)
(volume_filename_decoder, xattr_selinux_decoder)
(xattr_acls_a_decoder, xattr_acls_d_decoder, xattr_coder)
(xattr_decoder, sparse_major_decoder, sparse_minor_decoder):
Prefer idx_t to size_t.

src/xheader.c

index a3b41e81f329a96a4c6084bfd23a45f055329dfa..289f386ed3716e5bedd245a38621451f08d353f4 100644 (file)
@@ -52,7 +52,7 @@ static intmax_t global_header_count;
 /* 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;
@@ -66,7 +66,7 @@ x_obstack_1grow (struct xheader *xhdr, char c)
 }
 
 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;
@@ -257,7 +257,6 @@ char *
 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;
@@ -268,7 +267,7 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, intmax_t n)
   char nbuf[INTMAX_STRSIZE_BOUND];
   char const *nptr = NULL;
 
-  len = 0;
+  idx_t len = 0;
   for (p = fmt; *p; p++)
     {
       if (*p == '%' && p[1])
@@ -399,16 +398,16 @@ xheader_ghdr_name (void)
 {
   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);
@@ -417,11 +416,7 @@ xheader_ghdr_name (void)
 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:
@@ -434,21 +429,17 @@ xheader_write (char type, char *name, time_t t, struct xheader *xhdr)
        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);
@@ -544,7 +535,7 @@ struct xhdr_tab
   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 */
 };
@@ -564,7 +555,7 @@ locate_handler (char const *keyword)
   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;
       }
@@ -606,7 +597,7 @@ xheader_protected_keyword_p (const char *keyword)
 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;
@@ -684,7 +675,7 @@ run_override_list (struct keyword_list *kp, struct tar_stat_info *st)
 }
 
 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;
@@ -729,7 +720,7 @@ xheader_decode (struct tar_stat_info *st)
 
 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);
@@ -783,12 +774,12 @@ xheader_store (char const *keyword, struct tar_stat_info *st,
 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;
@@ -799,14 +790,10 @@ xheader_read (struct xheader *xhdr, union block *p, off_t size)
 
   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);
 
@@ -828,66 +815,55 @@ xheader_read (struct xheader *xhdr, union block *p, off_t size)
    (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);
@@ -957,7 +933,6 @@ xheader_string_end (struct xheader *xhdr, char const *keyword)
   uintmax_t len;
   uintmax_t p;
   uintmax_t n = 0;
-  size_t size;
   char nbuf[UINTMAX_STRSIZE_BOUND];
   char const *np;
   char *cp;
@@ -977,7 +952,7 @@ xheader_string_end (struct xheader *xhdr, char const *keyword)
   while (n != p);
 
   p = strlen (keyword) + n + 2;
-  size = p;
+  idx_t size = p;
   if (size != p)
     {
       paxerror (0,
@@ -1136,7 +1111,7 @@ static void
 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)
 {
 }
 
@@ -1151,7 +1126,7 @@ static void
 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))
@@ -1170,7 +1145,7 @@ static void
 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),
@@ -1189,7 +1164,7 @@ static void
 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);
 }
@@ -1205,7 +1180,7 @@ static void
 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);
 }
@@ -1221,7 +1196,7 @@ static void
 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))
@@ -1240,7 +1215,7 @@ static void
 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))
@@ -1270,7 +1245,7 @@ static void
 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);
@@ -1280,7 +1255,7 @@ static void
 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);
@@ -1297,7 +1272,7 @@ static void
 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))
@@ -1316,7 +1291,7 @@ static void
 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),
@@ -1335,7 +1310,7 @@ static void
 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);
 }
@@ -1351,7 +1326,7 @@ static void
 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))
@@ -1373,7 +1348,7 @@ static void
 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))
@@ -1388,7 +1363,7 @@ static void
 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);
 }
 
@@ -1396,7 +1371,7 @@ static void
 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))
@@ -1413,7 +1388,7 @@ static void
 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);
 }
 
@@ -1421,7 +1396,7 @@ static void
 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))
@@ -1438,7 +1413,7 @@ static void
 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;
@@ -1517,9 +1492,9 @@ static void
 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);
 }
 
@@ -1535,7 +1510,7 @@ static void
 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);
 }
@@ -1552,7 +1527,7 @@ volume_size_coder (MAYBE_UNUSED struct tar_stat_info const *st,
 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))
@@ -1572,7 +1547,7 @@ volume_offset_coder (MAYBE_UNUSED struct tar_stat_info const *st,
 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))
@@ -1583,7 +1558,7 @@ static void
 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);
 }
@@ -1598,7 +1573,7 @@ xattr_selinux_coder (struct tar_stat_info const *st, char const *keyword,
 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);
 }
@@ -1613,7 +1588,7 @@ xattr_acls_a_coder (struct tar_stat_info const *st , char const *keyword,
 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;
@@ -1629,7 +1604,7 @@ xattr_acls_d_coder (struct tar_stat_info const *st , char const *keyword,
 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;
@@ -1639,7 +1614,8 @@ static void
 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);
@@ -1647,7 +1623,7 @@ xattr_coder (struct tar_stat_info const *st, char const *keyword,
 
 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;
 
@@ -1672,7 +1648,7 @@ static void
 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))
@@ -1690,7 +1666,7 @@ static void
 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))