Module Name: src Committed By: snj Date: Tue Jan 2 10:56:58 UTC 2018
Modified Files: src/sys/netinet [netbsd-8]: in.c ip_output.c src/sys/netinet6 [netbsd-8]: in6.c in6_pcb.c src/sys/sys [netbsd-8]: lwp.h Log Message: Pull up following revision(s) (requested by ozaki-r in ticket #463): sys/netinet/in.c: revision 1.212 sys/netinet/ip_output.c: revision 1.288 sys/netinet6/in6.c: revision 1.256 sys/netinet6/in6_pcb.c: revision 1.163 sys/sys/lwp.h: revision 1.176 Add missing curlwp_bindx -- Add missing curlwp_bindx -- Check LP_BOUND is surely set in curlwp_bindx This may find an extra call of curlwp_bindx. -- Fix usage of curlwp_bind in ip_output curlwp_bindx must be called in LIFO order, i.e., we can't call curlwp_bind and curlwp_bindx like this: bound1 = curlwp_bind(); bound2 = curlwp_bind(); curlwp_bindx(bound1); curlwp_bindx(bound2); ip_outout did so if NET_MPSAFE. Fix it. -- Fix wrong usage of psref_held We can't use it for checking if a caller does NOT hold a given target. If you want to do it you should have psref_not_held or something. To generate a diff of this commit: cvs rdiff -u -r1.203.2.4 -r1.203.2.5 src/sys/netinet/in.c cvs rdiff -u -r1.279.2.3 -r1.279.2.4 src/sys/netinet/ip_output.c cvs rdiff -u -r1.245.2.4 -r1.245.2.5 src/sys/netinet6/in6.c cvs rdiff -u -r1.161.4.1 -r1.161.4.2 src/sys/netinet6/in6_pcb.c cvs rdiff -u -r1.174 -r1.174.4.1 src/sys/sys/lwp.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/netinet/in.c diff -u src/sys/netinet/in.c:1.203.2.4 src/sys/netinet/in.c:1.203.2.5 --- src/sys/netinet/in.c:1.203.2.4 Tue Jan 2 10:20:34 2018 +++ src/sys/netinet/in.c Tue Jan 2 10:56:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: in.c,v 1.203.2.4 2018/01/02 10:20:34 snj Exp $ */ +/* $NetBSD: in.c,v 1.203.2.5 2018/01/02 10:56:58 snj Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.203.2.4 2018/01/02 10:20:34 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.203.2.5 2018/01/02 10:56:58 snj Exp $"); #include "arp.h" @@ -845,7 +845,7 @@ in_purgeaddr(struct ifaddr *ifa) struct in_ifaddr *ia = (void *) ifa; struct ifnet *ifp = ifa->ifa_ifp; - KASSERT(!ifa_held(ifa)); + /* KASSERT(!ifa_held(ifa)); XXX need ifa_not_held (psref_not_held) */ ifa->ifa_flags |= IFA_DESTROYING; in_scrubaddr(ia); Index: src/sys/netinet/ip_output.c diff -u src/sys/netinet/ip_output.c:1.279.2.3 src/sys/netinet/ip_output.c:1.279.2.4 --- src/sys/netinet/ip_output.c:1.279.2.3 Tue Jan 2 10:20:34 2018 +++ src/sys/netinet/ip_output.c Tue Jan 2 10:56:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_output.c,v 1.279.2.3 2018/01/02 10:20:34 snj Exp $ */ +/* $NetBSD: ip_output.c,v 1.279.2.4 2018/01/02 10:56:58 snj Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.279.2.3 2018/01/02 10:20:34 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.279.2.4 2018/01/02 10:56:58 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -303,6 +303,10 @@ ip_output(struct mbuf *m0, struct mbuf * !in_hosteq(dst->sin_addr, ip->ip_dst))) rtcache_free(ro); + /* XXX must be before rtcache operations */ + bound = curlwp_bind(); + bind_need_restore = true; + if ((rt = rtcache_validate(ro)) == NULL && (rt = rtcache_update(ro, 1)) == NULL) { dst = &udst.sin; @@ -311,8 +315,6 @@ ip_output(struct mbuf *m0, struct mbuf * goto bad; } - bound = curlwp_bind(); - bind_need_restore = true; /* * If routing to interface only, short circuit routing lookup. */ Index: src/sys/netinet6/in6.c diff -u src/sys/netinet6/in6.c:1.245.2.4 src/sys/netinet6/in6.c:1.245.2.5 --- src/sys/netinet6/in6.c:1.245.2.4 Tue Jan 2 10:20:34 2018 +++ src/sys/netinet6/in6.c Tue Jan 2 10:56:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: in6.c,v 1.245.2.4 2018/01/02 10:20:34 snj Exp $ */ +/* $NetBSD: in6.c,v 1.245.2.5 2018/01/02 10:56:58 snj Exp $ */ /* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.245.2.4 2018/01/02 10:20:34 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.245.2.5 2018/01/02 10:56:58 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1384,7 +1384,7 @@ in6_purgeaddr(struct ifaddr *ifa) struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa; struct in6_multi_mship *imm; - KASSERT(!ifa_held(ifa)); + /* KASSERT(!ifa_held(ifa)); XXX need ifa_not_held (psref_not_held) */ KASSERT(IFNET_LOCKED(ifp)); ifa->ifa_flags |= IFA_DESTROYING; Index: src/sys/netinet6/in6_pcb.c diff -u src/sys/netinet6/in6_pcb.c:1.161.4.1 src/sys/netinet6/in6_pcb.c:1.161.4.2 --- src/sys/netinet6/in6_pcb.c:1.161.4.1 Tue Jan 2 10:20:34 2018 +++ src/sys/netinet6/in6_pcb.c Tue Jan 2 10:56:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: in6_pcb.c,v 1.161.4.1 2018/01/02 10:20:34 snj Exp $ */ +/* $NetBSD: in6_pcb.c,v 1.161.4.2 2018/01/02 10:56:58 snj Exp $ */ /* $KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.161.4.1 2018/01/02 10:20:34 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.161.4.2 2018/01/02 10:56:58 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -512,6 +512,7 @@ in6_pcbconnect(void *v, struct sockaddr_ if (ia4 == NULL) { if (error == 0) error = EADDRNOTAVAIL; + curlwp_bindx(bound); return (error); } memset(&mapped, 0, sizeof(mapped)); @@ -521,6 +522,7 @@ in6_pcbconnect(void *v, struct sockaddr_ ia4_release(ia4, &_psref); in6a = &mapped; #else + curlwp_bindx(bound); return EADDRNOTAVAIL; #endif } else { Index: src/sys/sys/lwp.h diff -u src/sys/sys/lwp.h:1.174 src/sys/sys/lwp.h:1.174.4.1 --- src/sys/sys/lwp.h:1.174 Fri Apr 21 15:10:35 2017 +++ src/sys/sys/lwp.h Tue Jan 2 10:56:58 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: lwp.h,v 1.174 2017/04/21 15:10:35 christos Exp $ */ +/* $NetBSD: lwp.h,v 1.174.4.1 2018/01/02 10:56:58 snj Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2010 @@ -542,6 +542,8 @@ curlwp_bind(void) static inline void curlwp_bindx(int bound) { + + KASSERT(curlwp->l_pflag & LP_BOUND); curlwp->l_pflag ^= bound ^ LP_BOUND; }