Enter network epoch when calling in_pcbconnect() for IPv6 mapped to IPv4
UDP sockets. This is miss from r356983. Reported by: https://syzkaller.appspot.com/bug?id=73c7a2e3f0783f9947459065e5c2f25fe8f82f54
This commit is contained in:
parent
7754e281c0
commit
e617b21d2f
@ -1177,6 +1177,7 @@ udp6_close(struct socket *so)
|
|||||||
static int
|
static int
|
||||||
udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
|
udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||||
{
|
{
|
||||||
|
struct epoch_tracker et;
|
||||||
struct inpcb *inp;
|
struct inpcb *inp;
|
||||||
struct inpcbinfo *pcbinfo;
|
struct inpcbinfo *pcbinfo;
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
@ -1215,10 +1216,12 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
|
|||||||
vflagsav = inp->inp_vflag;
|
vflagsav = inp->inp_vflag;
|
||||||
inp->inp_vflag |= INP_IPV4;
|
inp->inp_vflag |= INP_IPV4;
|
||||||
inp->inp_vflag &= ~INP_IPV6;
|
inp->inp_vflag &= ~INP_IPV6;
|
||||||
|
NET_EPOCH_ENTER(et);
|
||||||
INP_HASH_WLOCK(pcbinfo);
|
INP_HASH_WLOCK(pcbinfo);
|
||||||
error = in_pcbconnect(inp, (struct sockaddr *)&sin,
|
error = in_pcbconnect(inp, (struct sockaddr *)&sin,
|
||||||
td->td_ucred);
|
td->td_ucred);
|
||||||
INP_HASH_WUNLOCK(pcbinfo);
|
INP_HASH_WUNLOCK(pcbinfo);
|
||||||
|
NET_EPOCH_EXIT(et);
|
||||||
/*
|
/*
|
||||||
* If connect succeeds, mark socket as connected. If
|
* If connect succeeds, mark socket as connected. If
|
||||||
* connect fails and socket is unbound, reset inp_vflag
|
* connect fails and socket is unbound, reset inp_vflag
|
||||||
|
Loading…
x
Reference in New Issue
Block a user