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:
Gleb Smirnoff 2005-02-22 07:50:02 +00:00
parent 914d092f5d
commit 3a1757b9c0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=142207

View File

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