Module Name:    src
Committed By:   christos
Date:           Wed May 19 20:41:59 UTC 2010

Modified Files:
        src/sys/arch/evbmips/adm5120: machdep.c
        src/sys/dev/usb: if_cdce.c
        src/sys/net: if_ether.h if_etherip.c if_ethersubr.c if_tap.c

Log Message:
Replace ether_nonstatic_aton with a
- better named one
- not suffering from buffer oveflow
- simpler
- handling different separators
- returning error codes for errors

Some ideas from one posted on tech-net by Jonathan A. Kollasch


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/evbmips/adm5120/machdep.c
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/if_cdce.c
cvs rdiff -u -r1.57 -r1.58 src/sys/net/if_ether.h
cvs rdiff -u -r1.29 -r1.30 src/sys/net/if_etherip.c
cvs rdiff -u -r1.179 -r1.180 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.64 -r1.65 src/sys/net/if_tap.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/arch/evbmips/adm5120/machdep.c
diff -u src/sys/arch/evbmips/adm5120/machdep.c:1.16 src/sys/arch/evbmips/adm5120/machdep.c:1.17
--- src/sys/arch/evbmips/adm5120/machdep.c:1.16	Mon Feb  8 14:02:27 2010
+++ src/sys/arch/evbmips/adm5120/machdep.c	Wed May 19 16:41:59 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.16 2010/02/08 19:02:27 joerg Exp $ */
+/* $NetBSD: machdep.c,v 1.17 2010/05/19 20:41:59 christos Exp $ */
 
 /*-
  * Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
@@ -107,7 +107,7 @@
  */
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.16 2010/02/08 19:02:27 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.17 2010/05/19 20:41:59 christos Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -281,7 +281,7 @@
 		} else if (strcmp(key, "kmac") == 0) {
 			prop_data_t pd;
 
-			ether_nonstatic_aton(enaddr, val);
+			(void)ether_aton_r(enaddr, sizeof(enaddr), val);
 			if (properties == NULL)
 				continue;
 			pd = prop_data_create_data(enaddr, sizeof(enaddr));

Index: src/sys/dev/usb/if_cdce.c
diff -u src/sys/dev/usb/if_cdce.c:1.28 src/sys/dev/usb/if_cdce.c:1.29
--- src/sys/dev/usb/if_cdce.c:1.28	Mon Apr  5 03:21:48 2010
+++ src/sys/dev/usb/if_cdce.c	Wed May 19 16:41:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cdce.c,v 1.28 2010/04/05 07:21:48 joerg Exp $ */
+/*	$NetBSD: if_cdce.c,v 1.29 2010/05/19 20:41:59 christos Exp $ */
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wp...@windriver.com>
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.28 2010/04/05 07:21:48 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.29 2010/05/19 20:41:59 christos Exp $");
 #ifdef	__NetBSD__
 #include "opt_inet.h"
 #endif
@@ -268,7 +268,7 @@
 		memcpy(&eaddr[1], &hardclock_ticks, sizeof(u_int32_t));
 		eaddr[5] = (u_int8_t)(device_unit(sc->cdce_dev));
 	} else {
-		(void)ether_nonstatic_aton(eaddr, eaddr_str);
+		(void)ether_aton_r(eaddr, sizeof(eaddr), eaddr_str);
 	}
 
 	s = splnet();

Index: src/sys/net/if_ether.h
diff -u src/sys/net/if_ether.h:1.57 src/sys/net/if_ether.h:1.58
--- src/sys/net/if_ether.h:1.57	Wed May 19 14:58:22 2010
+++ src/sys/net/if_ether.h	Wed May 19 16:41:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ether.h,v 1.57 2010/05/19 18:58:22 jakllsch Exp $	*/
+/*	$NetBSD: if_ether.h,v 1.58 2010/05/19 20:41:59 christos 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 *, const char *);
+int	ether_aton_r(u_char *, size_t, const char *);
 #else
 /*
  * Prototype ethers(3) functions.

Index: src/sys/net/if_etherip.c
diff -u src/sys/net/if_etherip.c:1.29 src/sys/net/if_etherip.c:1.30
--- src/sys/net/if_etherip.c:1.29	Mon Apr  5 03:22:23 2010
+++ src/sys/net/if_etherip.c	Wed May 19 16:41:59 2010
@@ -1,4 +1,4 @@
-/*      $NetBSD: if_etherip.c,v 1.29 2010/04/05 07:22:23 joerg Exp $        */
+/*      $NetBSD: if_etherip.c,v 1.30 2010/05/19 20:41:59 christos Exp $        */
 
 /*
  *  Copyright (c) 2006, Hans Rosenfeld <rosenf...@grumpf.hope-2000.org>
@@ -86,7 +86,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.29 2010/04/05 07:22:23 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.30 2010/05/19 20:41:59 christos Exp $");
 
 #include "opt_inet.h"
 
@@ -691,7 +691,7 @@
 		return EINVAL;
 
 	/* Commit change */
-	if (ether_nonstatic_aton(enaddr, addr) != 0)
+	if (ether_aton_r(enaddr, sizeof(enaddr), addr) != 0)
 		return EINVAL;
 
 	if_set_sadl(ifp, enaddr, ETHER_ADDR_LEN, false);

Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.179 src/sys/net/if_ethersubr.c:1.180
--- src/sys/net/if_ethersubr.c:1.179	Wed May 19 14:58:22 2010
+++ src/sys/net/if_ethersubr.c	Wed May 19 16:41:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.179 2010/05/19 18:58:22 jakllsch Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.180 2010/05/19 20:41:59 christos 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.179 2010/05/19 18:58:22 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.180 2010/05/19 20:41:59 christos Exp $");
 
 #include "opt_inet.h"
 #include "opt_atalk.h"
@@ -1224,50 +1224,43 @@
  * ether_aton implementation, not using a static buffer.
  */
 int
-ether_nonstatic_aton(u_char *dest, const char *src)
+ether_aton_r(u_char *dest, size_t len, const char *str)
 {
-	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 == ' ') {
+        int i;
+        const u_char *cp = (const void *)str;
+	u_char *ep;
+
+#define atox(c)	(((c) < '9') ? ((c) - '0') : ((toupper(c) - 'A') + 10))
+
+	if (len < ETHER_ADDR_LEN)
+		return ENOSPC;
+
+	ep = dest + ETHER_ADDR_LEN;
+	 
+	while (*cp) {
+                if (!isxdigit(*cp))
+                        return EINVAL;
+		*dest = atox(*cp);
+		cp++;
+                if (isxdigit(*cp)) {
+                        *dest = (*dest << 4) | atox(*cp);
+			dest++;
+			cp++;
+                } else
+			*dest++;
+		if (dest == ep)
+			return *cp == '\0' ? 0 : ENAMETOOLONG;
+		switch (*cp) {
+		case ':':
+		case '-':
+		case '.':
 			cp++;
-			continue;
+			break;
 		}
-		if (isxdigit(*cp) || i == (ETHER_ADDR_LEN - 1))
-			continue;
-		return 1;
-	}
-	memcpy(dest, val, ETHER_ADDR_LEN);
-
-	return 0;
-#undef set_value
+        }
+	return ENOBUFS;
 }
 
-
 /*
  * Convert a sockaddr into an Ethernet address or range of Ethernet
  * addresses.

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.64 src/sys/net/if_tap.c:1.65
--- src/sys/net/if_tap.c:1.64	Mon Apr  5 03:22:24 2010
+++ src/sys/net/if_tap.c	Wed May 19 16:41:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.64 2010/04/05 07:22:24 joerg Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.65 2010/05/19 20:41:59 christos Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.64 2010/04/05 07:22:24 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.65 2010/05/19 20:41:59 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 
@@ -1391,7 +1391,7 @@
 		return (EINVAL);
 
 	/* Commit change */
-	if (ether_nonstatic_aton(enaddr, addr) != 0)
+	if (ether_aton_r(enaddr, sizeof(enaddr), addr) != 0)
 		return (EINVAL);
 	if_set_sadl(ifp, enaddr, ETHER_ADDR_LEN, false);
 	return (error);

Reply via email to