From 3c7eeb2af5e97c074ea1ba29f1ebe7a2d710ea48 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Mar 2000 22:35:33 +1100 Subject: [PATCH] - Don't permanently fail on bind() if getaddrinfo has more choices left for us. Needed to work around messy IPv6 on Linux. Patch from Arkadiusz Miskiewicz --- CREDITS | 1 + ChangeLog | 3 +++ channels.c | 12 ++++++++++-- sshd.c | 3 ++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CREDITS b/CREDITS index 08d160cb9..234bc1178 100644 --- a/CREDITS +++ b/CREDITS @@ -6,6 +6,7 @@ Theo de Raadt, and Dug Song - Creators of OpenSSH Andrew Stribblehill - Bugfixes Andre Lucas - build, login and many other fixes Andy Sloane - bugfixes +Arkadiusz Miskiewicz - IPv6 compat fixes Ben Taylor - Solaris debugging and fixes Chip Salzenberg - Assorted patches Chris Saia - SuSE packaging diff --git a/ChangeLog b/ChangeLog index a0afccb2c..735444f1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ 20000303 - Added "make host-key" target, Suggestion from Dominik Brettnacher + - Don't permanently fail on bind() if getaddrinfo has more choices left for + us. Needed to work around messy IPv6 on Linux. Patch from Arkadiusz + Miskiewicz 20000302 - Big cleanup of autoconf code diff --git a/channels.c b/channels.c index ba4c2bef9..7d5e9a1af 100644 --- a/channels.c +++ b/channels.c @@ -16,7 +16,7 @@ */ #include "includes.h" -RCSID("$Id: channels.c,v 1.16 2000/01/17 02:22:55 damien Exp $"); +RCSID("$Id: channels.c,v 1.17 2000/03/03 11:35:33 damien Exp $"); #include "ssh.h" #include "packet.h" @@ -935,7 +935,11 @@ channel_request_local_forwarding(u_short port, const char *host, /* Bind the socket to the address. */ if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) { /* address can be in use ipv6 address is already bound */ - verbose("bind: %.100s", strerror(errno)); + if (!ai->ai_next) + error("bind: %.100s", strerror(errno)); + else + verbose("bind: %.100s", strerror(errno)); + close(sock); continue; } @@ -1199,6 +1203,10 @@ x11_create_display_inet(int screen_number, int x11_display_offset) debug("bind port %d: %.100s", port, strerror(errno)); shutdown(sock, SHUT_RDWR); close(sock); + + if (ai->ai_next) + continue; + for (n = 0; n < num_socks; n++) { shutdown(socks[n], SHUT_RDWR); close(socks[n]); diff --git a/sshd.c b/sshd.c index f49b45368..0024440ed 100644 --- a/sshd.c +++ b/sshd.c @@ -558,7 +558,8 @@ main(int ac, char **av) debug("Bind to port %s on %s.", strport, ntop); /* Bind the socket to the desired port. */ - if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0) { + if ((bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0) && + (!ai->ai_next)) { error("Bind to port %s on %s failed: %.200s.", strport, ntop, strerror(errno)); close(listen_sock);