1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-03 09:00:21 +00:00

Move lock assertions to top of in6_pcbladdr(): we still want them to run

even if we're going to return an argument-based error.

Assert pcbinfo lock in in6_pcblookup_local(), in6_pcblookup_hash(), since
they walk pcbinfo inpcb lists.

Assert inpcb and pcbinfo locks in in6_pcbsetport(), since
port reservations are changing.

MFC after:	3 months
This commit is contained in:
Robert Watson 2006-04-25 12:09:58 +00:00
parent 102ea03373
commit 8deea4a8f3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=158011
2 changed files with 10 additions and 3 deletions

View File

@ -297,6 +297,9 @@ in6_pcbladdr(inp, nam, plocal_addr6)
struct ifnet *ifp = NULL;
int scope_ambiguous = 0;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
INP_LOCK_ASSERT(inp);
if (nam->sa_len != sizeof (*sin6))
return (EINVAL);
if (sin6->sin6_family != AF_INET6)
@ -309,9 +312,6 @@ in6_pcbladdr(inp, nam, plocal_addr6)
if ((error = sa6_embedscope(sin6, ip6_use_defzone)) != 0)
return(error);
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
INP_LOCK_ASSERT(inp);
if (in6_ifaddr) {
/*
* If the destination address is UNSPECIFIED addr,
@ -723,6 +723,8 @@ in6_pcblookup_local(pcbinfo, laddr, lport_arg, wild_okay)
int matchwild = 3, wildcard;
u_short lport = lport_arg;
INP_INFO_WLOCK_ASSERT(pcbinfo);
if (!wild_okay) {
struct inpcbhead *head;
/*
@ -888,6 +890,8 @@ in6_pcblookup_hash(pcbinfo, faddr, fport_arg, laddr, lport_arg, wildcard, ifp)
u_short fport = fport_arg, lport = lport_arg;
int faith;
INP_INFO_RLOCK_ASSERT(pcbinfo);
if (faithprefix_p != NULL)
faith = (*faithprefix_p)(laddr);
else

View File

@ -760,6 +760,9 @@ in6_pcbsetport(laddr, inp, cred)
int count, error = 0, wild = 0;
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
INP_INFO_WLOCK_ASSERT(pcbinfo);
INP_LOCK_ASSERT(inp);
/* XXX: this is redundant when called from in6_pcbbind */
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0)
wild = INPLOOKUP_WILDCARD;