Module Name:    src
Committed By:   jakllsch
Date:           Wed May 19 18:58:22 UTC 2010

Modified Files:
        src/sys/net: if_ether.h if_ethersubr.c

Log Message:
Changes to ether_nonstatic_aton():

Be more leinent on input string format.  Each nibble pair may optionally be
followed by any of ':', '-', '.' or ' '.

Make source string const and work on a temporary copy.  The caller may not
expect their string to be destroyed.


To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/sys/net/if_ether.h
cvs rdiff -u -r1.178 -r1.179 src/sys/net/if_ethersubr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_ether.h
diff -u src/sys/net/if_ether.h:1.56 src/sys/net/if_ether.h:1.57
--- src/sys/net/if_ether.h:1.56	Wed Mar 18 15:14:31 2009
+++ src/sys/net/if_ether.h	Wed May 19 18:58:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ether.h,v 1.56 2009/03/18 15:14:31 cegger Exp $	*/
+/*	$NetBSD: if_ether.h,v 1.57 2010/05/19 18:58:22 jakllsch Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -310,7 +310,7 @@
 uint32_t ether_crc32_le(const uint8_t *, size_t);
 uint32_t ether_crc32_be(const uint8_t *, size_t);
 
-int	ether_nonstatic_aton(u_char *, char *);
+int	ether_nonstatic_aton(u_char *, const char *);
 #else
 /*
  * Prototype ethers(3) functions.

Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.178 src/sys/net/if_ethersubr.c:1.179
--- src/sys/net/if_ethersubr.c:1.178	Wed May  5 18:12:24 2010
+++ src/sys/net/if_ethersubr.c	Wed May 19 18:58:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.178 2010/05/05 18:12:24 dyoung Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.179 2010/05/19 18:58:22 jakllsch Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.178 2010/05/05 18:12:24 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.179 2010/05/19 18:58:22 jakllsch Exp $");
 
 #include "opt_inet.h"
 #include "opt_atalk.h"
@@ -1224,38 +1224,47 @@
  * ether_aton implementation, not using a static buffer.
  */
 int
-ether_nonstatic_aton(u_char *dest, char *str)
+ether_nonstatic_aton(u_char *dest, const char *src)
 {
-        int i;
-        char *cp = str;
-        u_char val[6];
-
-#define set_value                       \
-        if (*cp > '9' && *cp < 'a')     \
-                *cp -= 'A' - 10;        \
-        else if (*cp > '9')             \
-                *cp -= 'a' - 10;        \
-        else                            \
-                *cp -= '0'
-
-        for (i = 0; i < 6; i++, cp++) {
-                if (!isxdigit(*cp))
-                        return (1);
-                set_value;
-                val[i] = *cp++;
-                if (isxdigit(*cp)) {
-                        set_value;
-                        val[i] *= 16;
-                        val[i] += *cp++;
-                }
-                if (*cp == ':' || i == 5)
-                        continue;
-                else
-                        return 1;
-        }
-        memcpy(dest, val, 6);
+	int i;
+	char str[3 * ETHER_ADDR_LEN + 2];
+	u_char val[ETHER_ADDR_LEN];
+	char *cp;
+
+#define set_value			\
+	if (*cp > '9' && *cp < 'a')	\
+		*cp -= 'A' - 10;	\
+	else if (*cp > '9')		\
+		*cp -= 'a' - 10;	\
+	else				\
+		*cp -= '0'
+
+	strlcpy(str, src, sizeof(str));
+
+	cp = str;
+
+	for (i = 0; i < ETHER_ADDR_LEN; i++) {
+		if (!isxdigit(*cp))
+			return 1;
+		set_value;
+		val[i] = *cp++;
+		if (isxdigit(*cp)) {
+			set_value;
+			val[i] <<= 4;
+			val[i] += *cp++;
+		}
+		if (*cp == ':' || *cp == '-' || *cp == '.' || *cp == ' ') {
+			cp++;
+			continue;
+		}
+		if (isxdigit(*cp) || i == (ETHER_ADDR_LEN - 1))
+			continue;
+		return 1;
+	}
+	memcpy(dest, val, ETHER_ADDR_LEN);
 
-        return 0;
+	return 0;
+#undef set_value
 }
 
 

Reply via email to