More defensive atoi()
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 20 Oct 2013 17:01:28 +0000 (10:01 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:10:25 +0000 (11:10 -0800)
Needed this to catch a bug in the old plan9 code, where atoi was used
instead of strtol.

Here's the old notes from that bug:

We were setting the netfile's type to 0, which means we would never
detect/match any incoming packets.  This includes broadcast packets
that we sent ourselves (such as an arp, telling us that we are
10.0.2.15).

The root issue is atoi vs strtol.  atoi is supposed to be for base
10, though NxM uses atoi for netifwrite.  Perhaps their strtol
allows a base prefix to override the base parameter.

kern/src/string.c

index e0b8497..33cddad 100644 (file)
@@ -400,10 +400,12 @@ strtoul(const char *s, char **endptr, int base)
        return (neg ? -val : val);
 }
 
-
-int
-atoi(const char* s)
+int atoi(const char *s)
 {
+       if (!s)
+               return 0;
+       if (s[0] == '0' && s[1] == 'x')
+               warn("atoi() used on a hex string!");
        // no overflow detection
        return (int)strtol(s,NULL,10);
 }