Module Name: src Committed By: maxv Date: Tue Jan 31 17:13:36 UTC 2017
Modified Files: src/sys/net: if_ecosubr.c if_tokensubr.c Log Message: Correctly handle the return value of arpresolve, otherwise we either leak memory or use some we already freed. Sent on tech-net, ok christos To generate a diff of this commit: cvs rdiff -u -r1.50 -r1.51 src/sys/net/if_ecosubr.c cvs rdiff -u -r1.80 -r1.81 src/sys/net/if_tokensubr.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_ecosubr.c diff -u src/sys/net/if_ecosubr.c:1.50 src/sys/net/if_ecosubr.c:1.51 --- src/sys/net/if_ecosubr.c:1.50 Tue Jan 24 18:37:20 2017 +++ src/sys/net/if_ecosubr.c Tue Jan 31 17:13:36 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ecosubr.c,v 1.50 2017/01/24 18:37:20 maxv Exp $ */ +/* $NetBSD: if_ecosubr.c,v 1.51 2017/01/31 17:13:36 maxv Exp $ */ /*- * Copyright (c) 2001 Ben Harris @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ecosubr.c,v 1.50 2017/01/24 18:37:20 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ecosubr.c,v 1.51 2017/01/31 17:13:36 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -194,12 +194,11 @@ eco_output(struct ifnet *ifp, struct mbu #ifdef INET case AF_INET: if (m->m_flags & M_BCAST) - memcpy(ehdr.eco_dhost, eco_broadcastaddr, - ECO_ADDR_LEN); + memcpy(ehdr.eco_dhost, eco_broadcastaddr, ECO_ADDR_LEN); + else if ((error = arpresolve(ifp, rt, m, dst, ehdr.eco_dhost, + sizeof(ehdr.eco_dhost))) != 0) + return error == EWOULDBLOCK ? 0 : error; - 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)) mcopy = m_copy(m, 0, (int)M_COPYALL); Index: src/sys/net/if_tokensubr.c diff -u src/sys/net/if_tokensubr.c:1.80 src/sys/net/if_tokensubr.c:1.81 --- src/sys/net/if_tokensubr.c:1.80 Tue Jan 24 18:37:20 2017 +++ src/sys/net/if_tokensubr.c Tue Jan 31 17:13:36 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tokensubr.c,v 1.80 2017/01/24 18:37:20 maxv Exp $ */ +/* $NetBSD: if_tokensubr.c,v 1.81 2017/01/31 17:13:36 maxv Exp $ */ /* * Copyright (c) 1982, 1989, 1993 @@ -92,7 +92,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.80 2017/01/24 18:37:20 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tokensubr.c,v 1.81 2017/01/31 17:13:36 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -222,8 +222,11 @@ token_output(struct ifnet *ifp0, struct */ else { struct llentry *la; - if (!arpresolve(ifp, rt, m, dst, edst, sizeof(edst))) - return (0); /* if not yet resolved */ + + error = arpresolve(ifp, rt, m, dst, edst, sizeof(edst)); + if (error != 0) + return error == EWOULDBLOCK ? 0 : error; + la = rt->rt_llinfo; KASSERT(la != NULL); TOKEN_RIF_LLE_ASSERT(la);