diff --git a/ChangeLog b/ChangeLog index 28e6ac4a2..0c6e463f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +20030107 + - (djm) Bug #401: Work around Linux breakage with IPv6 mapped addresses. + Based on fix from yoshfuji@linux-ipv6.org + 20030103 - (djm) Bug #461: ssh-copy-id fails with no arguments. Patch from cjwatson@debian.org @@ -925,4 +929,4 @@ save auth method before monitor_reset_key_state(); bugzilla bug #284; ok provos@ -$Id: ChangeLog,v 1.2540 2003/01/03 03:52:53 djm Exp $ +$Id: ChangeLog,v 1.2541 2003/01/06 23:51:23 djm Exp $ diff --git a/canohost.c b/canohost.c index 9aa942a9f..941db23b6 100644 --- a/canohost.c +++ b/canohost.c @@ -59,11 +59,14 @@ get_remote_hostname(int socket, int verify_reverse_mapping) memset(&from, 0, sizeof(from)); from4->sin_family = AF_INET; + fromlen = sizeof(*from4); memcpy(&from4->sin_addr, &addr, sizeof(addr)); from4->sin_port = port; } } #endif + if (from.ss_family == AF_INET6) + fromlen = sizeof(struct sockaddr_in6); if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop), NULL, 0, NI_NUMERICHOST) != 0) @@ -225,6 +228,11 @@ get_socket_address(int socket, int remote, int flags) < 0) return NULL; } + + /* Work around Linux IPv6 weirdness */ + if (addr.ss_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); + /* Get the address in ascii. */ if (getnameinfo((struct sockaddr *)&addr, addrlen, ntop, sizeof(ntop), NULL, 0, flags) != 0) { @@ -319,6 +327,11 @@ get_sock_port(int sock, int local) fatal_cleanup(); } } + + /* Work around Linux IPv6 weirdness */ + if (from.ss_family == AF_INET6) + fromlen = sizeof(struct sockaddr_in6); + /* Return port number. */ if (getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0, strport, sizeof(strport), NI_NUMERICSERV) != 0)