]> git.ipfire.org Git - thirdparty/make.git/commitdiff
* src/misc.c (make_toui): Parse a string into an unsigned int
authorPaul Smith <psmith@gnu.org>
Sat, 4 Jun 2022 21:44:21 +0000 (17:44 -0400)
committerPaul Smith <psmith@gnu.org>
Sat, 4 Jun 2022 22:34:15 +0000 (18:34 -0400)
* src/makeint.h: Declare it.
* src/arscan.c (ar_scan): Replace atoi() calls with make_toui().
Modify some integral types to be more correct.
* src/job.c (load_too_high): Replace atoi() calls with make_toui().
* src/main.c (main): Ditto.
(decode_switches): Ditto.

src/arscan.c
src/job.c
src/main.c
src/makeint.h
src/misc.c

index b94f283d31799deb98a0eadba4c657f57a166fc9..8337791063e7f5ba4dcf0832893c2f389a67364c 100644 (file)
@@ -441,7 +441,7 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg)
 # endif
 #endif
   char *namemap = 0;
-  int namemap_size = 0;
+  unsigned int namemap_size = 0;
   int desc = open (archive, O_RDONLY, 0);
   if (desc < 0)
     return -1;
@@ -541,7 +541,7 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg)
 
     while (1)
       {
-        int nread;
+        ssize_t nread;
         struct ar_hdr member_header;
 #ifdef AIAMAGBIG
         struct ar_hdr_big member_header_big;
@@ -696,10 +696,11 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg)
               && (name[0] == ' ' || name[0] == '/')
               && namemap != 0)
             {
-              int name_off = atoi (name + 1);
-              int name_len;
+              const char* err;
+              unsigned int name_off = make_toui (name + 1, &err);
+              size_t name_len;
 
-              if (name_off < 0 || name_off >= namemap_size)
+              if (err|| name_off >= namemap_size)
                 goto invalid;
 
               name = namemap + name_off;
@@ -712,9 +713,10 @@ ar_scan (const char *archive, ar_member_func_t function, const void *arg)
                    && name[1] == '1'
                    && name[2] == '/')
             {
-              int name_len = atoi (name + 3);
+              const char* err;
+              unsigned int name_len = make_toui (name + 3, &err);
 
-              if (name_len < 1)
+              if (err || name_len == 0 || name_len > PATH_MAX)
                 goto invalid;
 
               name = alloca (name_len + 1);
index 6060cad8c036d427a84cbc19a3cca5e8e7e463c8..d24288ac613cf4c4abbf75eed69ee4343a6c94b9 100644 (file)
--- a/src/job.c
+++ b/src/job.c
@@ -2065,8 +2065,8 @@ load_too_high (void)
 
               if (p && ISDIGIT(p[1]))
                 {
-                  int cnt = atoi (p+1);
-                  DB (DB_JOBS, ("Running: system = %d / make = %u (max requested = %f)\n",
+                  unsigned int cnt = make_toui (p+1, NULL);
+                  DB (DB_JOBS, ("Running: system = %u / make = %u (max requested = %f)\n",
                                 cnt, job_slots_used, max_load_average));
                   return (double)cnt > max_load_average;
                 }
index 829824bbd6f2714a704a2c8ce297207ff08b03a1..0d2dff720a6300b0d99d0673a3a1036555545d5f 100644 (file)
@@ -1411,7 +1411,7 @@ main (int argc, char **argv, char **envp)
                 OUTPUT_TRACED ();
                 ++ep;
               }
-            restarts = (unsigned int) atoi (ep);
+            restarts = make_toui (ep, NULL);
             export = v_noexport;
           }
 
@@ -1536,7 +1536,7 @@ main (int argc, char **argv, char **envp)
   {
     struct variable *v = lookup_variable (STRING_SIZE_TUPLE (MAKELEVEL_NAME));
     if (v && v->value[0] != '\0' && v->value[0] != '-')
-      makelevel = (unsigned int) atoi (v->value);
+      makelevel = make_toui (v->value, NULL);
     else
       makelevel = 0;
   }
@@ -3187,14 +3187,10 @@ decode_switches (int argc, const char **argv, int env)
 
                   if (coptarg)
                     {
-                      int i = atoi (coptarg);
-                      const char *cp;
-
-                      /* Yes, I realize we're repeating this in some cases.  */
-                      for (cp = coptarg; ISDIGIT (cp[0]); ++cp)
-                        ;
+                      const char *err;
+                      unsigned int i = make_toui (coptarg, &err);
 
-                      if (i < 1 || cp[0] != '\0')
+                      if (err || i == 0)
                         {
                           error (NILF, 0,
                                  _("the '-%c' option requires a positive integer argument"),
index 6bcb0c2c5e663393506f77bfa25611678a2e969c..bb013fd1d400cd3c605d0d28c26141a2543da1db 100644 (file)
@@ -541,6 +541,7 @@ void die (int) NORETURN;
 void pfatal_with_name (const char *) NORETURN;
 void perror_with_name (const char *, const char *);
 #define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
+unsigned int make_toui (const char*, const char**);
 pid_t make_pid ();
 void *xmalloc (size_t);
 void *xcalloc (size_t);
index b03f2a3a163ebbc6d761c61c6cd8b2e2f4bd085e..624cd0582777eac0482ece2fc0bcf63daa7147c3 100644 (file)
@@ -34,6 +34,25 @@ this program.  If not, see <http://www.gnu.org/licenses/>.  */
 # include <sys/file.h>
 #endif
 
+unsigned int
+make_toui (const char *str, const char **error)
+{
+  char *end;
+  unsigned long val = strtoul (str, &end, 10);
+
+  if (error)
+    {
+      if (str[0] == '\0')
+        *error = "Missing value";
+      else if (*end != '\0')
+        *error = "Invalid value";
+      else
+        *error = NULL;
+    }
+
+  return val;
+}
+
 /* Compare strings *S1 and *S2.
    Return negative if the first is less, positive if it is greater,
    zero if they are equal.  */