diff options
author | kmacy <kmacy@FreeBSD.org> | 2007-12-17 04:19:25 +0000 |
---|---|---|
committer | kmacy <kmacy@FreeBSD.org> | 2007-12-17 04:19:25 +0000 |
commit | 139d7c3fb10ebc149150f89c9ad8ae77b08265a8 (patch) | |
tree | 2270736261fe518c1e199025acaa27dc93382694 /sys/netinet/if_ether.c | |
parent | d717f8cf061b8e1ae723ff0b21dbf7a39e76252a (diff) | |
download | FreeBSD-src-139d7c3fb10ebc149150f89c9ad8ae77b08265a8.zip FreeBSD-src-139d7c3fb10ebc149150f89c9ad8ae77b08265a8.tar.gz |
Don't panic in arpresolve if we're given a null mbuf. We could
insist that the caller just pass in an initialized mbuf even
if didn't have any data - but that seems rather contrived.
Diffstat (limited to 'sys/netinet/if_ether.c')
-rw-r--r-- | sys/netinet/if_ether.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 86544aa..006c966 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -362,13 +362,16 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, struct sockaddr_dl *sdl; int error; - if (m->m_flags & M_BCAST) { /* broadcast */ - (void)memcpy(desten, ifp->if_broadcastaddr, ifp->if_addrlen); - return (0); - } - if (m->m_flags & M_MCAST && ifp->if_type != IFT_ARCNET) {/* multicast */ - ETHER_MAP_IP_MULTICAST(&SIN(dst)->sin_addr, desten); - return (0); + if (m != NULL) { + + if (m->m_flags & M_BCAST) { /* broadcast */ + (void)memcpy(desten, ifp->if_broadcastaddr, ifp->if_addrlen); + return (0); + } + if (m->m_flags & M_MCAST && ifp->if_type != IFT_ARCNET) {/* multicast */ + ETHER_MAP_IP_MULTICAST(&SIN(dst)->sin_addr, desten); + return (0); + } } if (rt0 != NULL) { @@ -449,10 +452,11 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, * response yet. Replace the held mbuf with this * latest one. */ - if (la->la_hold) - m_freem(la->la_hold); - la->la_hold = m; - + if (m != NULL) { + if (la->la_hold) + m_freem(la->la_hold); + la->la_hold = m; + } KASSERT(rt->rt_expire > 0, ("sending ARP request for static entry")); /* |