summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authormaxim <maxim@FreeBSD.org>2006-05-21 19:28:46 +0000
committermaxim <maxim@FreeBSD.org>2006-05-21 19:28:46 +0000
commitfa6b08051c710322e2dbdb6f59f74414d771b5b3 (patch)
tree82418f9db4e13c7dac2b40f76b3a57b0d4e03779 /sys/netinet
parent2be20d920e7d20ca9ca90bce5b88693a2cfa576d (diff)
downloadFreeBSD-src-fa6b08051c710322e2dbdb6f59f74414d771b5b3.zip
FreeBSD-src-fa6b08051c710322e2dbdb6f59f74414d771b5b3.tar.gz
o In udp|rip_disconnect() acquire a socket lock before the socket
state modification. To prevent races do that while holding inpcb lock. Reviewed by: rwatson
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/raw_ip.c4
-rw-r--r--sys/netinet/udp_usrreq.c4
2 files changed, 6 insertions, 2 deletions
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index 63a6245..b311c74 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -671,9 +671,11 @@ rip_disconnect(struct socket *so)
INP_INFO_WLOCK(&ripcbinfo);
INP_LOCK(inp);
inp->inp_faddr.s_addr = INADDR_ANY;
+ SOCK_LOCK(so);
+ so->so_state &= ~SS_ISCONNECTED;
+ SOCK_UNLOCK(so);
INP_UNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
- so->so_state &= ~SS_ISCONNECTED;
return (0);
}
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index bb1c0ff..5118290 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -1057,9 +1057,11 @@ udp_disconnect(struct socket *so)
in_pcbdisconnect(inp);
inp->inp_laddr.s_addr = INADDR_ANY;
+ SOCK_LOCK(so);
+ so->so_state &= ~SS_ISCONNECTED; /* XXX */
+ SOCK_UNLOCK(so);
INP_UNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
- so->so_state &= ~SS_ISCONNECTED; /* XXX */
return 0;
}
OpenPOWER on IntegriCloud