MFp4 bz_ipv6_fast:
Properly protect the inp read access when handling the control code. In the past this was expensive but given the rlock it's not so much anymore. Spotted while: optimizing udp6 Discussed with: rwatson (a few months ago) Sponsored by: The FreeBSD Foundation Sponsored by: iXsystems Reviewed by: gnn (as part of the whole) MFC After: 3 days
This commit is contained in:
parent
fe722ad5af
commit
38909f6222
@ -971,12 +971,14 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
||||
}
|
||||
|
||||
src.sin_family = 0;
|
||||
INP_RLOCK(inp);
|
||||
if (control != NULL) {
|
||||
/*
|
||||
* XXX: Currently, we assume all the optional information is
|
||||
* stored in a single mbuf.
|
||||
*/
|
||||
if (control->m_next) {
|
||||
INP_RUNLOCK(inp);
|
||||
m_freem(control);
|
||||
m_freem(m);
|
||||
return (EINVAL);
|
||||
@ -1018,6 +1020,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
||||
m_freem(control);
|
||||
}
|
||||
if (error) {
|
||||
INP_RUNLOCK(inp);
|
||||
m_freem(m);
|
||||
return (error);
|
||||
}
|
||||
@ -1039,7 +1042,6 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
||||
* XXXRW: Check that hash locking update here is correct.
|
||||
*/
|
||||
sin = (struct sockaddr_in *)addr;
|
||||
INP_RLOCK(inp);
|
||||
if (sin != NULL &&
|
||||
(inp->inp_laddr.s_addr == INADDR_ANY && inp->inp_lport == 0)) {
|
||||
INP_RUNLOCK(inp);
|
||||
|
Loading…
x
Reference in New Issue
Block a user