diff options
author | rwatson <rwatson@FreeBSD.org> | 2008-07-07 12:14:10 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2008-07-07 12:14:10 +0000 |
commit | 150304561534eb5256ffce7683bada44cebf7bb8 (patch) | |
tree | 5bc1c8b8d02230105eb2bf01991c0e72258cf849 | |
parent | fbc40d49484a8c0ea4f3b4edb05f07daf51921b3 (diff) | |
download | FreeBSD-src-150304561534eb5256ffce7683bada44cebf7bb8.zip FreeBSD-src-150304561534eb5256ffce7683bada44cebf7bb8.tar.gz |
Add additional udbinfo and inpcb locking assertions to udp_output(); for
some code paths, global or inpcb write locks are required, but for other
code paths, read locks or no locking at all are sufficient for the data
structures.
MFC after: 1 month
-rw-r--r-- | sys/netinet/udp_usrreq.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 9422e7e..2098da9 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -860,6 +860,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, laddr = inp->inp_laddr; lport = inp->inp_lport; if (src.sin_family == AF_INET) { + INP_INFO_LOCK_ASSERT(&udbinfo); if ((lport == 0) || (laddr.s_addr == INADDR_ANY && src.sin_addr.s_addr == INADDR_ANY)) { @@ -873,6 +874,8 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, } if (addr) { + INP_INFO_LOCK_ASSERT(&udbinfo); + INP_LOCK_ASSERT(inp); sin = (struct sockaddr_in *)addr; if (jailed(td->td_ucred)) prison_remote_ip(td->td_ucred, 0, @@ -889,6 +892,8 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, /* Commit the local port if newly assigned. */ if (inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0) { + INP_INFO_WLOCK_ASSERT(&udbinfo); + INP_WLOCK_ASSERT(inp); /* * Remember addr if jailed, to prevent rebinding. */ @@ -903,6 +908,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr, inp->inp_flags |= INP_ANONPORT; } } else { + INP_LOCK_ASSERT(inp); faddr = inp->inp_faddr; fport = inp->inp_fport; if (faddr.s_addr == INADDR_ANY) { |