From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Jprys-0002wC-En for qemu-devel@nongnu.org; Sat, 26 Apr 2008 17:30:50 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Jpryr-0002v2-Ld for qemu-devel@nongnu.org; Sat, 26 Apr 2008 17:30:50 -0400 Received: from [199.232.76.173] (port=38870 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Jpryr-0002uu-G1 for qemu-devel@nongnu.org; Sat, 26 Apr 2008 17:30:49 -0400 Received: from mail.windriver.com ([147.11.1.11] helo=mail.wrs.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Jpryr-0008I5-0G for qemu-devel@nongnu.org; Sat, 26 Apr 2008 17:30:49 -0400 Received: from ALA-MAIL03.corp.ad.wrs.com (ala-mail03 [147.11.57.144]) by mail.wrs.com (8.13.6/8.13.6) with ESMTP id m3QLUkJN017244 for ; Sat, 26 Apr 2008 14:30:46 -0700 (PDT) Message-ID: <48139F0A.6090706@windriver.com> Date: Sat, 26 Apr 2008 16:30:50 -0500 From: Jason Wessel MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] Fix regression against commit 4259 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Stuart Brady found a regression based on the 4259 commit where DNS via slirp to the special address does not work properly. I verified that DNS to the default special address 10.0.2.3 does not work. When using the "special address" for DNS it must be treated as a special case. In the original 4259, I did not have a test case for the loopback DNS. The translation logic should be used in this case as well as for any loopback directed requests. Signed-off-by: Jason Wessel --- slirp/udp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) --- a/slirp/udp.c +++ b/slirp/udp.c @@ -318,11 +318,12 @@ int udp_output(struct socket *so, struct struct sockaddr_in saddr, daddr; saddr = *addr; - if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr && - addr->sin_addr.s_addr == htonl(0x7f000001)) { - saddr.sin_addr.s_addr = so->so_faddr.s_addr; + if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) { if ((so->so_faddr.s_addr & htonl(0x000000ff)) == htonl(0xff)) saddr.sin_addr.s_addr = alias_addr.s_addr; + else if (addr->sin_addr.s_addr == htonl(0x7f000001) || + ((so->so_faddr.s_addr & htonl(CTL_DNS)) == htonl(CTL_DNS))) + saddr.sin_addr.s_addr = so->so_faddr.s_addr; } daddr.sin_addr = so->so_laddr; daddr.sin_port = so->so_lport;