Module Name: src Committed By: christos Date: Thu Apr 7 03:22:15 UTC 2016
Modified Files: src/sys/net: if_arcsubr.c if_ecosubr.c if_ethersubr.c if_fddisubr.c if_ieee1394subr.c if_tokensubr.c src/sys/netinet: if_arp.c if_inarp.h Log Message: - tidy up error messages - add a length argument to arpresolve() - add KASSERT for overflow To generate a diff of this commit: cvs rdiff -u -r1.70 -r1.71 src/sys/net/if_arcsubr.c cvs rdiff -u -r1.44 -r1.45 src/sys/net/if_ecosubr.c cvs rdiff -u -r1.216 -r1.217 src/sys/net/if_ethersubr.c cvs rdiff -u -r1.96 -r1.97 src/sys/net/if_fddisubr.c cvs rdiff -u -r1.51 -r1.52 src/sys/net/if_ieee1394subr.c cvs rdiff -u -r1.73 -r1.74 src/sys/net/if_tokensubr.c cvs rdiff -u -r1.204 -r1.205 src/sys/netinet/if_arp.c cvs rdiff -u -r1.47 -r1.48 src/sys/netinet/if_inarp.h 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_arcsubr.c diff -u src/sys/net/if_arcsubr.c:1.70 src/sys/net/if_arcsubr.c:1.71 --- src/sys/net/if_arcsubr.c:1.70 Tue Feb 9 09:43:16 2016 +++ src/sys/net/if_arcsubr.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_arcsubr.c,v 1.70 2016/02/09 14:43:16 ozaki-r Exp $ */ +/* $NetBSD: if_arcsubr.c,v 1.71 2016/04/07 03:22:15 christos Exp $ */ /* * Copyright (c) 1994, 1995 Ignatios Souvatzis @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.70 2016/02/09 14:43:16 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.71 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -151,7 +151,8 @@ arc_output(struct ifnet *ifp, struct mbu adst = arcbroadcastaddr; /* ARCnet broadcast address */ else if (ifp->if_flags & IFF_NOARP) adst = ntohl(satocsin(dst)->sin_addr.s_addr) & 0xFF; - else if ((error = arpresolve(ifp, rt, m, dst, &adst)) != 0) + else if ((error = arpresolve(ifp, rt, m, dst, &adst, + sizeof(adst))) != 0) return error == EWOULDBLOCK ? 0 : error; /* If broadcasting on a simplex interface, loopback a copy */ Index: src/sys/net/if_ecosubr.c diff -u src/sys/net/if_ecosubr.c:1.44 src/sys/net/if_ecosubr.c:1.45 --- src/sys/net/if_ecosubr.c:1.44 Mon Aug 24 18:21:26 2015 +++ src/sys/net/if_ecosubr.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ecosubr.c,v 1.44 2015/08/24 22:21:26 pooka Exp $ */ +/* $NetBSD: if_ecosubr.c,v 1.45 2016/04/07 03:22:15 christos Exp $ */ /*- * Copyright (c) 2001 Ben Harris @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ecosubr.c,v 1.44 2015/08/24 22:21:26 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ecosubr.c,v 1.45 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -198,7 +198,8 @@ eco_output(struct ifnet *ifp, struct mbu memcpy(ehdr.eco_dhost, eco_broadcastaddr, ECO_ADDR_LEN); - else if (!arpresolve(ifp, rt, m, dst, ehdr.eco_dhost)) + else if (!arpresolve(ifp, rt, m, dst, ehdr.eco_dhost, + sizeof(ehdr.eco_dhost))) return (0); /* if not yet resolved */ /* If broadcasting on a simplex interface, loopback a copy */ if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX)) Index: src/sys/net/if_ethersubr.c diff -u src/sys/net/if_ethersubr.c:1.216 src/sys/net/if_ethersubr.c:1.217 --- src/sys/net/if_ethersubr.c:1.216 Tue Feb 9 03:32:12 2016 +++ src/sys/net/if_ethersubr.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ethersubr.c,v 1.216 2016/02/09 08:32:12 ozaki-r Exp $ */ +/* $NetBSD: if_ethersubr.c,v 1.217 2016/04/07 03:22:15 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.216 2016/02/09 08:32:12 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.217 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -243,7 +243,8 @@ ether_output(struct ifnet * const ifp0, (void)memcpy(edst, etherbroadcastaddr, sizeof(edst)); else if (m->m_flags & M_MCAST) ETHER_MAP_IP_MULTICAST(&satocsin(dst)->sin_addr, edst); - else if ((error = arpresolve(ifp, rt, m, dst, edst)) != 0) + else if ((error = arpresolve(ifp, rt, m, dst, edst, + sizeof(edst))) != 0) return error == EWOULDBLOCK ? 0 : error; /* If broadcasting on a simplex interface, loopback a copy */ if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX)) Index: src/sys/net/if_fddisubr.c diff -u src/sys/net/if_fddisubr.c:1.96 src/sys/net/if_fddisubr.c:1.97 --- src/sys/net/if_fddisubr.c:1.96 Tue Feb 9 03:32:12 2016 +++ src/sys/net/if_fddisubr.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_fddisubr.c,v 1.96 2016/02/09 08:32:12 ozaki-r Exp $ */ +/* $NetBSD: if_fddisubr.c,v 1.97 2016/04/07 03:22:15 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -96,7 +96,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_fddisubr.c,v 1.96 2016/02/09 08:32:12 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_fddisubr.c,v 1.97 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_gateway.h" @@ -235,7 +235,8 @@ fddi_output(struct ifnet *ifp0, struct m else if (m->m_flags & M_MCAST) { ETHER_MAP_IP_MULTICAST(&satocsin(dst)->sin_addr, (char *)edst); - } else if ((error = arpresolve(ifp, rt, m, dst, edst)) != 0) + } else if ((error = arpresolve(ifp, rt, m, dst, edst, + sizeof(edst))) != 0) return error == EWOULDBLOCK ? 0 : error; /* If broadcasting on a simplex interface, loopback a copy */ if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX)) Index: src/sys/net/if_ieee1394subr.c diff -u src/sys/net/if_ieee1394subr.c:1.51 src/sys/net/if_ieee1394subr.c:1.52 --- src/sys/net/if_ieee1394subr.c:1.51 Tue Oct 13 08:33:07 2015 +++ src/sys/net/if_ieee1394subr.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ieee1394subr.c,v 1.51 2015/10/13 12:33:07 roy Exp $ */ +/* $NetBSD: if_ieee1394subr.c,v 1.52 2016/04/07 03:22:15 christos Exp $ */ /* * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ieee1394subr.c,v 1.51 2015/10/13 12:33:07 roy Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ieee1394subr.c,v 1.52 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -139,7 +139,8 @@ ieee1394_output(struct ifnet *ifp, struc #ifdef INET case AF_INET: if (unicast && - (error = arpresolve(ifp, rt, m0, dst, (u_char *)hwdst)) !=0) + (error = arpresolve(ifp, rt, m0, dst, hwdst, + sizeof(*hwdst))) != 0) return error == EWOULDBLOCK ? 0 : error; /* if broadcasting on a simplex interface, loopback a copy */ if ((m0->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX)) Index: src/sys/net/if_tokensubr.c diff -u src/sys/net/if_tokensubr.c:1.73 src/sys/net/if_tokensubr.c:1.74 --- src/sys/net/if_tokensubr.c:1.73 Tue Feb 9 03:32:12 2016 +++ src/sys/net/if_tokensubr.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tokensubr.c,v 1.73 2016/02/09 08:32:12 ozaki-r Exp $ */ +/* $NetBSD: if_tokensubr.c,v 1.74 2016/04/07 03:22:15 christos Exp $ */ /* * Copyright (c) 1982, 1989, 1993 @@ -92,7 +92,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.73 2016/02/09 08:32:12 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.74 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -219,7 +219,7 @@ token_output(struct ifnet *ifp0, struct */ else { struct llentry *la; - if (!arpresolve(ifp, rt, m, dst, edst)) + if (!arpresolve(ifp, rt, m, dst, edst, sizeof(edst))) return (0); /* if not yet resolved */ la = rt->rt_llinfo; KASSERT(la != NULL); Index: src/sys/netinet/if_arp.c diff -u src/sys/netinet/if_arp.c:1.204 src/sys/netinet/if_arp.c:1.205 --- src/sys/netinet/if_arp.c:1.204 Mon Apr 4 03:37:07 2016 +++ src/sys/netinet/if_arp.c Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_arp.c,v 1.204 2016/04/04 07:37:07 ozaki-r Exp $ */ +/* $NetBSD: if_arp.c,v 1.205 2016/04/07 03:22:15 christos Exp $ */ /*- * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.204 2016/04/04 07:37:07 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.205 2016/04/07 03:22:15 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -573,7 +573,7 @@ arp_rtrequest(int req, struct rtentry *r if (gate->sa_family != AF_LINK || gate->sa_len < sockaddr_dl_measure(0, ifp->if_addrlen)) { - log(LOG_DEBUG, "arp_rtrequest: bad gateway value\n"); + log(LOG_DEBUG, "%s: bad gateway value\n", __func__); break; } @@ -693,7 +693,7 @@ arprequest(struct ifnet *ifp, */ int arpresolve(struct ifnet *ifp, struct rtentry *rt, struct mbuf *m, - const struct sockaddr *dst, u_char *desten) + const struct sockaddr *dst, void *desten, size_t destlen) { struct llentry *la; const char *create_lookup; @@ -708,6 +708,7 @@ arpresolve(struct ifnet *ifp, struct rte if ((la->la_flags & LLE_VALID) && ((la->la_flags & LLE_STATIC) || la->la_expire > time_uptime)) { + KASSERT(destlen >= ifp->if_addrlen); memcpy(desten, &la->ll_addr, ifp->if_addrlen); LLE_RUNLOCK(la); return 0; @@ -719,7 +720,7 @@ arpresolve(struct ifnet *ifp, struct rte #ifdef DIAGNOSTIC if (rt->rt_expire == 0) { /* This should never happen. (Should it? -gwr) */ - printf("arpresolve: unresolved and rt_expire == 0\n"); + printf("%s: unresolved and rt_expire == 0\n", __func__); /* Set expiration time to now (expired). */ rt->rt_expire = time_uptime; } @@ -767,6 +768,7 @@ notfound: if ((la->la_flags & LLE_VALID) && ((la->la_flags & LLE_STATIC) || la->la_expire > time_uptime)) { + KASSERT(destlen >= ifp->if_addrlen); memcpy(desten, &la->ll_addr, ifp->if_addrlen); renew = false; /* @@ -800,8 +802,8 @@ notfound: if (la->la_flags & LLE_STATIC) { /* should not happen! */ LLE_RUNLOCK(la); - log(LOG_DEBUG, "arpresolve: ouch, empty static llinfo for %s\n", - inet_ntoa(satocsin(dst)->sin_addr)); + log(LOG_DEBUG, "%s: ouch, empty static llinfo for %s\n", + __func__, inet_ntoa(satocsin(dst)->sin_addr)); error = EINVAL; goto bad; } @@ -1225,6 +1227,7 @@ in_arpinput(struct mbuf *m) } #endif /* NTOKEN > 0 */ + KASSERT(sizeof(la->ll_addr) >= ifp->if_addrlen); (void)memcpy(&la->ll_addr, ar_sha(ah), ifp->if_addrlen); la->la_flags |= LLE_VALID; la->la_expire = time_uptime + arpt_keep; @@ -1431,8 +1434,8 @@ arp_ifinit(struct ifnet *ifp, struct ifa (struct sockaddr *)IA_SIN(ifa)); IF_AFDATA_WUNLOCK(ifp); if (lle == NULL) - log(LOG_INFO, "arp_ifinit: cannot create arp " - "entry for interface address\n"); + log(LOG_INFO, "%s: cannot create arp entry for" + " interface address\n", __func__); else { arp_init_llentry(ifp, lle); LLE_RUNLOCK(lle); @@ -1535,10 +1538,9 @@ arp_dad_start(struct ifaddr *ifa) */ if (!(ia->ia4_flags & IN_IFF_TENTATIVE)) { log(LOG_DEBUG, - "arp_dad_start: called with non-tentative address " - "%s(%s)\n", - in_fmtaddr(ia->ia_addr.sin_addr), - ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); + "%s: called with non-tentative address %s(%s)\n", __func__, + in_fmtaddr(ia->ia_addr.sin_addr), + ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); return; } if (!ip_dad_count) { @@ -1561,10 +1563,9 @@ arp_dad_start(struct ifaddr *ifa) dp = malloc(sizeof(*dp), M_IPARP, M_NOWAIT); if (dp == NULL) { - log(LOG_ERR, "arp_dad_start: memory allocation failed for " - "%s(%s)\n", - in_fmtaddr(ia->ia_addr.sin_addr), - ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); + log(LOG_ERR, "%s: memory allocation failed for %s(%s)\n", + __func__, in_fmtaddr(ia->ia_addr.sin_addr), + ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); return; } memset(dp, 0, sizeof(*dp)); @@ -1623,33 +1624,32 @@ arp_dad_timer(struct ifaddr *ifa) /* Sanity check */ if (ia == NULL) { - log(LOG_ERR, "arp_dad_timer: called with null parameter\n"); + log(LOG_ERR, "%s: called with null parameter\n", __func__); goto done; } dp = arp_dad_find(ifa); if (dp == NULL) { - log(LOG_ERR, "arp_dad_timer: DAD structure not found\n"); + log(LOG_ERR, "%s: DAD structure not found\n", __func__); goto done; } if (ia->ia4_flags & IN_IFF_DUPLICATED) { - log(LOG_ERR, "nd4_dad_timer: called with duplicate address " - "%s(%s)\n", - in_fmtaddr(ia->ia_addr.sin_addr), - ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); + log(LOG_ERR, "%s: called with duplicate address %s(%s)\n", + __func__, in_fmtaddr(ia->ia_addr.sin_addr), + ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); goto done; } - if ((ia->ia4_flags & IN_IFF_TENTATIVE) == 0 && dp->dad_arp_acount == 0){ - log(LOG_ERR, "arp_dad_timer: called with non-tentative address " - "%s(%s)\n", - in_fmtaddr(ia->ia_addr.sin_addr), - ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); + if ((ia->ia4_flags & IN_IFF_TENTATIVE) == 0 && dp->dad_arp_acount == 0) + { + log(LOG_ERR, "%s: called with non-tentative address %s(%s)\n", + __func__, in_fmtaddr(ia->ia_addr.sin_addr), + ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???"); goto done; } /* timeouted with IFF_{RUNNING,UP} check */ if (dp->dad_arp_tcount > dad_maxtry) { arplog((LOG_INFO, "%s: could not run DAD, driver problem?\n", - if_name(ifa->ifa_ifp))); + if_name(ifa->ifa_ifp))); TAILQ_REMOVE(&dadq, dp, dad_list); free(dp, M_IPARP); @@ -1725,13 +1725,13 @@ arp_dad_duplicated(struct ifaddr *ifa) dp = arp_dad_find(ifa); if (dp == NULL) { - log(LOG_ERR, "arp_dad_duplicated: DAD structure not found\n"); + log(LOG_ERR, "%s: DAD structure not found\n", __func__); return; } ifp = ifa->ifa_ifp; - log(LOG_ERR, "%s: DAD detected duplicate IPv4 address %s: " - "ARP out=%d\n", + log(LOG_ERR, + "%s: DAD detected duplicate IPv4 address %s: ARP out=%d\n", if_name(ifp), in_fmtaddr(ia->ia_addr.sin_addr), dp->dad_arp_ocount); Index: src/sys/netinet/if_inarp.h diff -u src/sys/netinet/if_inarp.h:1.47 src/sys/netinet/if_inarp.h:1.48 --- src/sys/netinet/if_inarp.h:1.47 Thu May 21 05:26:18 2015 +++ src/sys/netinet/if_inarp.h Wed Apr 6 23:22:15 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_inarp.h,v 1.47 2015/05/21 09:26:18 ozaki-r Exp $ */ +/* $NetBSD: if_inarp.h,v 1.48 2016/04/07 03:22:15 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -76,7 +76,7 @@ extern struct ifqueue arpintrq; void arp_ifinit(struct ifnet *, struct ifaddr *); void arp_rtrequest(int, struct rtentry *, const struct rt_addrinfo *); int arpresolve(struct ifnet *, struct rtentry *, struct mbuf *, - const struct sockaddr *, u_char *); + const struct sockaddr *, void *, size_t); void arpintr(void); void arprequest(struct ifnet *, const struct in_addr *, const struct in_addr *, const u_int8_t *);