summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-10-27 10:27:27 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-10-27 10:27:27 -0700
commitcafa6c8ec1d6e4bddde190edb742be864ce3f9b3 (patch)
treee0f1280b20889b9328346508afab6194ed37928c
parent94afda752956ddc6ff1accf931bc3d03c070bb18 (diff)
Restore old address parsing but with checkingv2.6.27
Go back to original address parsing for compatability, but document it and add more stringent checking.
-rw-r--r--lib/utils.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/lib/utils.c b/lib/utils.c
index bcc6a730..0bb08325 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -244,11 +244,39 @@ int get_s8(__s8 *val, const char *arg, int base)
return 0;
}
-int get_addr_1(inet_prefix *addr, const char *name, int family)
+/* This uses a non-standard parsing (ie not inet_aton, or inet_pton)
+ * because of legacy choice to parse 10.8 as 10.8.0.0 not 10.0.0.8
+ */
+static int get_addr_ipv4(__u8 *ap, const char *cp)
{
- unsigned long n;
- char *endp;
+ int i;
+
+ for (i = 0; i < 4; i++) {
+ unsigned long n;
+ char *endp;
+
+ n = strtoul(cp, &endp, 0);
+ if (n > 255)
+ return -1; /* bogus network value */
+
+ if (endp == cp) /* no digits */
+ return -1;
+
+ ap[i] = n;
+
+ if (*endp == '\0')
+ break;
+
+ if (i == 3 || *endp != '.')
+ return -1; /* extra characters */
+ cp = endp + 1;
+ }
+ return 1;
+}
+
+int get_addr_1(inet_prefix *addr, const char *name, int family)
+{
memset(addr, 0, sizeof(*addr));
if (strcmp(name, "default") == 0 ||
@@ -288,22 +316,7 @@ int get_addr_1(inet_prefix *addr, const char *name, int family)
if (family != AF_UNSPEC && family != AF_INET)
return -1;
- n = strtoul(name, &endp, 0);
- if (n > 255)
- return -1; /* bogus network value */
-
- if (endp == name) /* not a number */
- return -1;
-
- /* compatable with older usage (ie 10/8 = 10.0.0.0/8) */
- if (strchr(name, '.') == NULL) {
- addr->data[0] = n;
- addr->bytelen = 4;
- addr->bitlen = -1;
- return 0;
- }
-
- if (inet_aton(name, (struct in_addr *)addr->data) <= 0)
+ if (get_addr_ipv4((__u8 *)addr->data, name) <= 0)
return -1;
addr->bytelen = 4;