From 3a1757b9c073e2d2ee3e79a91e98fd62fa157182 Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Tue, 22 Feb 2005 07:50:02 +0000 Subject: [PATCH] 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 --- sys/netinet/udp_usrreq.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 29bfaf29314c..d96344b278f5 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -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;