Fix/eliminate use of atol
authorEric Andersen <andersen@codepoet.org>
Sat, 6 Mar 2004 22:11:45 +0000 (22:11 -0000)
committerEric Andersen <andersen@codepoet.org>
Sat, 6 Mar 2004 22:11:45 +0000 (22:11 -0000)
coreutils/printf.c
libbb/Makefile.in
libbb/safe_strtol.c [new file with mode: 0644]
loginutils/getty.c
networking/ftpgetput.c
networking/ifconfig.c
networking/ipcalc.c
networking/route.c
networking/wget.c

index 181c70bfb391e083ca1982c4e6887d2825c2d260..76f59686b62b341ae3b82cc2654ce9418062f575 100644 (file)
@@ -405,48 +405,24 @@ print_direc(char *start, size_t length, int field_width, int precision,
 static unsigned long xstrtoul(char *arg)
 {
        unsigned long result;
-       char *endptr;
-       //int errno_save = errno;
-
-       assert(arg!=NULL);
-
-       errno = 0;
-       result = strtoul(arg, &endptr, 0);
-       if (errno != 0 || *endptr!='\0' || endptr==arg)
+       if (safe_strtoul(arg, &result))
                fprintf(stderr, "%s", arg);
-       //errno = errno_save;
        return result;
 }
 
 static long xstrtol(char *arg)
 {
        long result;
-       char *endptr;
-       //int errno_save = errno;
-
-       assert(arg!=NULL);
-
-       errno = 0;
-       result = strtoul(arg, &endptr, 0);
-       if (errno != 0 || *endptr!='\0' || endptr==arg)
+       if (safe_strtol(arg, &result))
                fprintf(stderr, "%s", arg);
-       //errno = errno_save;
        return result;
 }
 
 static double xstrtod(char *arg)
 {
        double result;
-       char *endptr;
-       //int errno_save = errno;
-
-       assert(arg!=NULL);
-
-       errno = 0;
-       result = strtod(arg, &endptr);
-       if (errno != 0 || *endptr!='\0' || endptr==arg)
+       if (safe_strtod(arg, &result))
                fprintf(stderr, "%s", arg);
-       //errno = errno_save;
        return result;
 }
 
index a656a5a53deab02ff38186bbe6c3073d04bf4666..632208184d5dfc3850f8bebf358a250a4b8c64ca 100644 (file)
@@ -1,6 +1,6 @@
 # Makefile for busybox
 #
-# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
+# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -72,17 +72,21 @@ LIBBB_MSRC3:=$(LIBBB_DIR)xgetularg.c
 LIBBB_MOBJ3:=xgetularg_bnd_sfx.o xgetlarg_bnd_sfx.o getlarg10_sfx.o \
        xgetularg_bnd.o xgetularg10_bnd.o xgetularg10.o
 
+LIBBB_MSRC4:=$(LIBBB_DIR)/safe_strtol.c
+LIBBB_MOBJ4:=safe_strtoi.o safe_strtod.o safe_strtol.o safe_strtoul.o
+
 LIBBB_MOBJS0=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ0))
 LIBBB_MOBJS1=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ1))
 LIBBB_MOBJS2=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ2))
 LIBBB_MOBJS3=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ3))
+LIBBB_MOBJS4=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ4))
 
 libraries-y+=$(LIBBB_DIR)$(LIBBB_AR)
 
 $(LIBBB_DIR)$(LIBBB_AR): $(LIBBB_OBJS) $(LIBBB_MOBJS0) $(LIBBB_MOBJS1) \
-       $(LIBBB_MOBJS2) $(LIBBB_MOBJS3)
+       $(LIBBB_MOBJS2) $(LIBBB_MOBJS3) $(LIBBB_MOBJS4)
        $(AR) -ro $@ $(LIBBB_OBJS) $(LIBBB_MOBJS0) $(LIBBB_MOBJS1) \
-               $(LIBBB_MOBJS2) $(LIBBB_MOBJS3) 
+               $(LIBBB_MOBJS2) $(LIBBB_MOBJS3) $(LIBBB_MOBJS4)
 
 $(LIBBB_MOBJS0): $(LIBBB_MSRC0)
        $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@
@@ -96,3 +100,6 @@ $(LIBBB_MOBJS2): $(LIBBB_MSRC2)
 $(LIBBB_MOBJS3): $(LIBBB_MSRC3)
        $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@
 
+$(LIBBB_MOBJS4): $(LIBBB_MSRC4)
+       $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@
+
diff --git a/libbb/safe_strtol.c b/libbb/safe_strtol.c
new file mode 100644 (file)
index 0000000..fcbdba8
--- /dev/null
@@ -0,0 +1,92 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Utility routines.
+ *
+ * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+#include "libbb.h"
+
+#ifdef L_safe_strtoi
+extern
+int safe_strtoi(char *arg, int* value)
+{
+       int error;
+       long lvalue = *value;
+       error = safe_strtol(arg, &lvalue);
+       *value = (int) lvalue;
+       return error;
+}
+#endif
+
+#ifdef L_safe_strtod
+extern
+int safe_strtod(char *arg, double* value)
+{
+       char *endptr;
+       int errno_save = errno;
+
+       assert(arg!=NULL);
+       errno = 0;
+       *value = strtod(arg, &endptr);
+       if (errno != 0 || *endptr!='\0' || endptr==arg) {
+               return 1;
+       }
+       errno = errno_save;
+       return 0;
+}
+#endif
+
+#ifdef L_safe_strtol
+extern
+int safe_strtol(char *arg, long* value)
+{
+       char *endptr;
+       int errno_save = errno;
+
+       assert(arg!=NULL);
+       errno = 0;
+       *value = strtol(arg, &endptr, 0);
+       if (errno != 0 || *endptr!='\0' || endptr==arg) {
+               return 1;
+       }
+       errno = errno_save;
+       return 0;
+}
+#endif
+
+#ifdef L_safe_strtoul
+extern
+int safe_strtoul(char *arg, unsigned long* value)
+{
+       char *endptr;
+       int errno_save = errno;
+
+       assert(arg!=NULL);
+       errno = 0;
+       *value = strtoul(arg, &endptr, 0);
+       if (errno != 0 || *endptr!='\0' || endptr==arg) {
+               return 1;
+       }
+       errno = errno_save;
+       return 0;
+}
+#endif
+
index 4219ff821b1ae1c87f8f05539112bece7ff53151..b12b88fb1f294a73b182dfe3d0eff11b36072a0c 100644 (file)
@@ -955,22 +955,15 @@ static int caps_lock(const char *s)
 /* bcode - convert speed string to speed code; return 0 on failure */
 static int bcode(const char *s)
 {
-#if 0
-       struct Speedtab *sp;
-       long speed = atol(s);
-
-       for (sp = speedtab; sp->speed; sp++)
-               if (sp->speed == speed)
-                       return (sp->code);
-       return (0);
-#else
        int r;
-
-       if ((r = bb_value_to_baud(atol(s))) > 0) {
+       unsigned long value;
+       if (safe_strtoul(s, &value)) {
+               return -1;
+       }
+       if ((r = bb_value_to_baud(value)) > 0) {
                return r;
        }
        return 0;
-#endif
 }
 
 /* error - report errors to console or syslog; only understands %s and %m */
index 4f6be119622ca47fe8b437a2c103cbf9467ea15f..17ee8a536e033fed531d1025599a4e5f3dc9a3b0 100644 (file)
@@ -147,7 +147,10 @@ static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
        fd_data = xconnect_ftpdata(server, buf);
 
        if (ftpcmd("SIZE ", server_path, control_stream, buf) == 213) {
-               filesize = atol(buf + 4);
+               unsigned long value=filesize;
+               if (safe_strtoul(buf + 4, &filesize))
+                       bb_error_msg_and_die("SIZE error: %s", buf + 4);
+               filesize = value;
        }
 
        if ((local_path[0] == '-') && (local_path[1] == '\0')) {
index 9fdab3c3f31c04f6eb60f326fdfb3e1d187db411..341998d8d7727861d3c39bf406ff3679704b0ab0 100644 (file)
@@ -15,7 +15,7 @@
  * Foundation;  either  version 2 of the License, or  (at
  * your option) any later version.
  *
- * $Id: ifconfig.c,v 1.27 2003/11/14 03:04:08 andersen Exp $
+ * $Id: ifconfig.c,v 1.28 2004/03/06 22:11:44 andersen Exp $
  *
  */
 
@@ -394,8 +394,9 @@ int ifconfig_main(int argc, char **argv)
                                                safe_strncpy(host, *argv, (sizeof host));
 #ifdef CONFIG_FEATURE_IPV6
                                                if ((prefix = strchr(host, '/'))) {
-                                                       prefix_len = atol(prefix + 1);
-                                                       if ((prefix_len < 0) || (prefix_len > 128)) {
+                                                       if (safe_strtoi(prefix + 1, &prefix_len) ||
+                                                               (prefix_len < 0) || (prefix_len > 128))
+                                                       {
                                                                ++goterr;
                                                                goto LOOP;
                                                        }
index 2f1c02b7b63f4905b59fb4ab69054aa0158db639..d75c883b8e62bd446da1ee2bd06b2ce8211c8f83 100644 (file)
@@ -119,8 +119,7 @@ int ipcalc_main(int argc, char **argv)
                         if (*prefixstr) {
                                unsigned int msk;
 
-                                netprefix = atol(prefixstr);
-                                if (netprefix > 32) {
+                                                               if (safe_strtoul(prefixstr, &netprefix) || netprefix > 32) {
                                         IPCALC_MSG(bb_error_msg_and_die("bad IP prefix: %s\n", prefixstr),
                                                 exit(EXIT_FAILURE));
                                 }
index 083149a3d8336c1ed6c69eadba4923aa53ab1870..19942f421f66e6d7e531b536da20a1d43a280e81 100644 (file)
@@ -15,7 +15,7 @@
  * Foundation;  either  version 2 of the License, or  (at
  * your option) any later version.
  *
- * $Id: route.c,v 1.22 2003/03/19 09:12:39 mjn3 Exp $
+ * $Id: route.c,v 1.23 2004/03/06 22:11:44 andersen Exp $
  *
  * displayroute() code added by Vladimir N. Oleynik <dzo@simtreas.ru>
  * adjustments by Larry Doolittle  <LRDoolittle@lbl.gov>
@@ -351,8 +351,7 @@ static int INET6_setroute(int action, int options, char **args)
                memset(&sa6, 0, sizeof(sa6));
        } else {
                if ((cp = strchr(target, '/'))) {
-                       prefix_len = atol(cp + 1);
-                       if ((prefix_len < 0) || (prefix_len > 128))
+                       if (safe_strtod(cp + 1, &prefix_len) || (prefix_len < 0) || (prefix_len > 128))
                                bb_show_usage();
                        *cp = 0;
                } else {
index 823a053db6755e5a835ea2a8fb1253ba803c54fc..cb0790ea781b27892d7f183e753688dfaa663f05 100644 (file)
@@ -385,7 +385,11 @@ read_response:
                         */
                        while ((s = gethdr(buf, sizeof(buf), sfp, &n)) != NULL) {
                                if (strcasecmp(buf, "content-length") == 0) {
-                                       filesize = atol(s);
+                                       unsigned long value;
+                                       if (safe_strtoul(s, &value)) {
+                                               close_delete_and_die("content-length %s is garbage", s);
+                                       }
+                                       filesize = value;
                                        got_clen = 1;
                                        continue;
                                }
@@ -452,7 +456,11 @@ read_response:
                 * Querying file size
                 */
                if (ftpcmd("SIZE /", target.path, sfp, buf) == 213) {
-                       filesize = atol(buf+4);
+                       unsigned long value;
+                       if (safe_strtoul(buf+4, &value)) {
+                               close_delete_and_die("SIZE value is garbage");
+                       }
+                       filesize = value;
                        got_clen = 1;
                }
                
@@ -838,7 +846,7 @@ progressmeter(int flag)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     $Id: wget.c,v 1.69 2004/02/22 00:27:34 bug1 Exp $
+ *     $Id: wget.c,v 1.70 2004/03/06 22:11:44 andersen Exp $
  */