Module Name: src Committed By: maxv Date: Mon Jan 15 10:27:51 UTC 2018
Modified Files: src/sys/net: if_ethersubr.c Log Message: Several fixes: - Style and typos - Use kmem_zalloc, in case there is a padding between the fields of the structures - Use ETHER_ADDR_LEN instead of a hard-coded '6' - kmem_alloc(KM_SLEEP) can't fail - Simplify ether_aton_r - Use mutex_obj_free, not to leak memory To generate a diff of this commit: cvs rdiff -u -r1.251 -r1.252 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_ethersubr.c diff -u src/sys/net/if_ethersubr.c:1.251 src/sys/net/if_ethersubr.c:1.252 --- src/sys/net/if_ethersubr.c:1.251 Mon Jan 15 07:59:48 2018 +++ src/sys/net/if_ethersubr.c Mon Jan 15 10:27:51 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ethersubr.c,v 1.251 2018/01/15 07:59:48 maxv Exp $ */ +/* $NetBSD: if_ethersubr.c,v 1.252 2018/01/15 10:27:51 maxv 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.251 2018/01/15 07:59:48 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.252 2018/01/15 10:27:51 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -998,9 +998,7 @@ ether_ifdetach(struct ifnet *ifp) if (ifp->if_bridge) bridge_ifdetach(ifp); #endif - bpf_detach(ifp); - #if NVLAN > 0 if (ec->ec_nvlans) vlan_ifdetach(ifp); @@ -1014,7 +1012,7 @@ ether_ifdetach(struct ifnet *ifp) } ETHER_UNLOCK(ec); - mutex_destroy(ec->ec_lock); + mutex_obj_free(ec->ec_lock); ifp->if_mowner = NULL; MOWNER_DETACH(&ec->ec_rx_mowner); @@ -1127,17 +1125,18 @@ ether_aton_r(u_char *dest, size_t len, c while (*cp) { if (!isxdigit(*cp)) return EINVAL; + *dest = atox(*cp); cp++; if (isxdigit(*cp)) { *dest = (*dest << 4) | atox(*cp); - dest++; cp++; - } else { - dest++; } + dest++; + if (dest == ep) - return *cp == '\0' ? 0 : ENAMETOOLONG; + return (*cp == '\0') ? 0 : ENAMETOOLONG; + switch (*cp) { case ':': case '-': @@ -1183,8 +1182,7 @@ ether_multiaddr(const struct sockaddr *s */ memcpy(addrlo, ether_ipmulticast_min, ETHER_ADDR_LEN); memcpy(addrhi, ether_ipmulticast_max, ETHER_ADDR_LEN); - } - else { + } else { ETHER_MAP_IP_MULTICAST(&sin->sin_addr, addrlo); memcpy(addrhi, addrlo, ETHER_ADDR_LEN); } @@ -1229,8 +1227,6 @@ ether_addmulti(const struct sockaddr *sa /* Allocate out of lock */ enm = kmem_alloc(sizeof(*enm), KM_SLEEP); - if (enm == NULL) - return ENOBUFS; ETHER_LOCK(ec); error = ether_multiaddr(sa, addrlo, addrhi); @@ -1244,6 +1240,7 @@ ether_addmulti(const struct sockaddr *sa error = EINVAL; goto out; } + /* * See if the address range is already in the list. */ @@ -1256,20 +1253,23 @@ ether_addmulti(const struct sockaddr *sa error = 0; goto out; } + /* * Link a new multicast record into the interface's multicast list. */ - memcpy(enm->enm_addrlo, addrlo, 6); - memcpy(enm->enm_addrhi, addrhi, 6); + memcpy(enm->enm_addrlo, addrlo, ETHER_ADDR_LEN); + memcpy(enm->enm_addrhi, addrhi, ETHER_ADDR_LEN); enm->enm_refcount = 1; LIST_INSERT_HEAD(&ec->ec_multiaddrs, enm, enm_list); ec->ec_multicnt++; + /* * Return ENETRESET to inform the driver that the list has changed * and its reception filter should be adjusted accordingly. */ error = ENETRESET; enm = NULL; + out: ETHER_UNLOCK(ec); if (enm != NULL) @@ -1294,7 +1294,7 @@ ether_delmulti(const struct sockaddr *sa goto error; /* - * Look ur the address in our list. + * Look up the address in our list. */ ETHER_LOOKUP_MULTI(addrlo, addrhi, ec, enm); if (enm == NULL) { @@ -1308,19 +1308,21 @@ ether_delmulti(const struct sockaddr *sa error = 0; goto error; } + /* * No remaining claims to this record; unlink and free it. */ LIST_REMOVE(enm, enm_list); ec->ec_multicnt--; ETHER_UNLOCK(ec); - kmem_free(enm, sizeof(*enm)); + /* * Return ENETRESET to inform the driver that the list has changed * and its reception filter should be adjusted accordingly. */ return ENETRESET; + error: ETHER_UNLOCK(ec); return error; @@ -1361,7 +1363,7 @@ ether_ioctl(struct ifnet *ifp, u_long cm #ifdef INET if (ifa->ifa_addr->sa_family == AF_INET) arp_ifinit(ifp, ifa); -#endif /* INET */ +#endif return 0; } @@ -1565,7 +1567,7 @@ retry: goto out; } - addrs = kmem_alloc(sizeof(*addrs) * multicnt, KM_SLEEP); + addrs = kmem_zalloc(sizeof(*addrs) * multicnt, KM_SLEEP); ETHER_LOCK(ec); if (multicnt != ec->ec_multicnt) {