]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Fewer uses of size_t in names.c
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 1 Nov 2024 02:53:25 +0000 (19:53 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 2 Nov 2024 06:47:23 +0000 (23:47 -0700)
* src/names.c (name_buffer_length, read_name_from_file)
(copy_name, all_names_found, add_hierarchy_to_namelist)
(rebase_child_list, make_file_name, stripped_prefix_len):
Prefer idx_t to size_t.

src/common.h
src/names.c

index 91432c2cd57ebaa4aded8300c80395f283d853e5..ba432771788e775e653be1760326d78fc869b80d 100644 (file)
@@ -796,7 +796,7 @@ struct name *name_scan (const char *name, bool exact);
 struct name const *name_from_list (void);
 void blank_name_list (void);
 char *make_file_name (const char *dir_name, const char *name);
-ptrdiff_t stripped_prefix_len (char const *file_name, size_t num);
+ptrdiff_t stripped_prefix_len (char const *file_name, idx_t num);
 bool all_names_found (struct tar_stat_info *st);
 
 void add_avoided_name (char const *name);
index 1dba0194dd2dfa63a25207ff34ce2fd491cadafa..5a1873fcfad3796dc08db5a942b90312a3543bad 100644 (file)
@@ -867,7 +867,7 @@ name_add_file (const char *name)
 /* Names from external name file.  */
 
 static char *name_buffer;      /* buffer to hold the current file name */
-static size_t name_buffer_length; /* allocated length of name_buffer */
+static idx_t name_buffer_length; /* allocated length of name_buffer */
 
 /* Set up to gather file names for tar.  They can either come from a
    file or were saved from decoding arguments.  */
@@ -963,7 +963,7 @@ static enum read_file_list_state
 read_name_from_file (struct name_elt *ent)
 {
   int c;
-  size_t counter = 0;
+  idx_t counter = 0;
   FILE *fp = ent->v.file.fp;
   int term = ent->v.file.term;
 
@@ -971,7 +971,7 @@ read_name_from_file (struct name_elt *ent)
   for (c = getc (fp); c != EOF && c != term; c = getc (fp))
     {
       if (counter == name_buffer_length)
-       name_buffer = x2realloc (name_buffer, &name_buffer_length);
+       name_buffer = xpalloc (name_buffer, &name_buffer_length, 1, -1, 1);
       name_buffer[counter++] = c;
       if (c == 0)
        {
@@ -985,7 +985,7 @@ read_name_from_file (struct name_elt *ent)
     return file_list_skip;
 
   if (counter == name_buffer_length)
-    name_buffer = x2realloc (name_buffer, &name_buffer_length);
+    name_buffer = xpalloc (name_buffer, &name_buffer_length, 1, -1, 1);
   name_buffer[counter] = 0;
   return (counter == 0 && c == EOF) ? file_list_end : file_list_success;
 }
@@ -1086,13 +1086,11 @@ read_next_name (struct name_elt *ent, struct name_elt *ret)
 static void
 copy_name (struct name_elt *ep)
 {
-  const char *source;
-  size_t source_len;
-
-  source = ep->v.name;
-  source_len = strlen (source);
-  while (name_buffer_length <= source_len)
-    name_buffer = x2realloc(name_buffer, &name_buffer_length);
+  char const *source = ep->v.name;
+  idx_t source_len = strlen (source);
+  ptrdiff_t incr = source_len + 1 - name_buffer_length;
+  if (0 < incr)
+    name_buffer = xpalloc (name_buffer, &name_buffer_length, incr, -1, 1);
   strcpy (name_buffer, source);
   chopslash (name_buffer);
 }
@@ -1390,13 +1388,10 @@ name_match (const char *file_name)
 bool
 all_names_found (struct tar_stat_info *p)
 {
-  struct name const *cursor;
-  size_t len;
-
   if (!p->file_name || occurrence_option == 0 || p->had_trailing_slash)
     return false;
-  len = strlen (p->file_name);
-  for (cursor = namelist; cursor; cursor = cursor->next)
+  idx_t len = strlen (p->file_name);
+  for (struct name const *cursor = namelist; cursor; cursor = cursor->next)
     {
       if ((cursor->name[0] && !wasfound (cursor))
          || (len >= cursor->length && ISSLASH (p->file_name[cursor->length])))
@@ -1613,13 +1608,13 @@ add_hierarchy_to_namelist (struct tar_stat_info *st, struct name *name)
   if (buffer)
     {
       struct name *child_head = NULL, *child_tail = NULL;
-      size_t name_length = name->length;
-      size_t allocated_length = (name_length >= NAME_FIELD_SIZE
-                                ? name_length + NAME_FIELD_SIZE
-                                : NAME_FIELD_SIZE) + 2;
+      idx_t name_length = name->length;
+      idx_t allocated_length = (name_length >= NAME_FIELD_SIZE
+                               ? name_length + NAME_FIELD_SIZE
+                               : NAME_FIELD_SIZE) + 2;
       char *namebuf = xmalloc (allocated_length);
       const char *string;
-      size_t string_length;
+      idx_t string_length;
       idx_t change_dir = name->change_dir;
 
       strcpy (namebuf, name->name);
@@ -1640,8 +1635,9 @@ add_hierarchy_to_namelist (struct tar_stat_info *st, struct name *name)
 
              /* need to have at least string_length bytes above the
                 name_length, this includes the trailing null character */
-             while (allocated_length < name_length + string_length)
-               namebuf = x2realloc (namebuf, &allocated_length);
+             ptrdiff_t incr = name_length + string_length - allocated_length;
+             if (0 < incr)
+               namebuf = xpalloc (namebuf, &allocated_length, incr, -1, 1);
              strcpy (namebuf + name_length, string + 1);
              np = addname (namebuf, change_dir, false, name);
              if (!child_head)
@@ -1713,13 +1709,13 @@ name_compare (void const *entry1, void const *entry2)
 static void
 rebase_child_list (struct name *child, struct name *parent)
 {
-  size_t old_prefix_len = child->parent->length;
-  size_t new_prefix_len = parent->length;
+  idx_t old_prefix_len = child->parent->length;
+  idx_t new_prefix_len = parent->length;
   char *new_prefix = parent->name;
 
   for (; child; child = child->sibling)
     {
-      size_t size = child->length - old_prefix_len + new_prefix_len;
+      idx_t size = child->length - old_prefix_len + new_prefix_len;
       char *newp = xmalloc (size + 1);
       strcpy (newp, new_prefix);
       strcat (newp, child->name + old_prefix_len);
@@ -1948,8 +1944,8 @@ blank_name_list (void)
 char *
 make_file_name (const char *directory_name, const char *name)
 {
-  size_t dirlen = strlen (directory_name);
-  size_t namelen = strlen (name) + 1;
+  idx_t dirlen = strlen (directory_name);
+  idx_t namelen = strlen (name) + 1;
   int slash = dirlen && ! ISSLASH (directory_name[dirlen - 1]);
   char *buffer = xmalloc (dirlen + slash + namelen);
   memcpy (buffer, directory_name, dirlen);
@@ -1966,7 +1962,7 @@ make_file_name (const char *directory_name, const char *name)
    enough components.  */
 
 ptrdiff_t
-stripped_prefix_len (char const *file_name, size_t num)
+stripped_prefix_len (char const *file_name, idx_t num)
 {
   char const *p = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
   while (ISSLASH (*p))