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
This commit is contained in:
Maxim Konovalov 2006-05-21 19:28:46 +00:00
parent 635354c446
commit d45e4f9945
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=158800
2 changed files with 6 additions and 2 deletions

View File

@ -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);
}

View File

@ -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;
}