In in_pcbconnect_setup() jailed sockets are treated specially: if local
address is not supplied, then jail IP is choosed and in_pcbbind() is called. Since udp_output() does not save local addr after call to in_pcbconnect_setup(), in_pcbbind() is called for each packet, and this is incorrect. So, we shall treat jailed sockets specially in udp_output(), we will save their local address. This fixes a long standing bug with broken sendto() system call in jails. PR: kern/26506 Reviewed by: rwatson MFC after: 2 weeks
This commit is contained in:
parent
914d092f5d
commit
3a1757b9c0
@ -804,6 +804,11 @@ udp_output(inp, m, addr, control, td)
|
||||
/* Commit the local port if newly assigned. */
|
||||
if (inp->inp_laddr.s_addr == INADDR_ANY &&
|
||||
inp->inp_lport == 0) {
|
||||
/*
|
||||
* Remember addr if jailed, to prevent rebinding.
|
||||
*/
|
||||
if (jailed(td->td_ucred))
|
||||
inp->inp_laddr = laddr;
|
||||
inp->inp_lport = lport;
|
||||
if (in_pcbinshash(inp) != 0) {
|
||||
inp->inp_lport = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user