patch for openssh-1.2.2p1

Damien Miller djm at mindrot.org
Sat Mar 11 20:40:36 EST 2000


On Wed, 8 Mar 2000, Hideaki YOSHIFUJI wrote:

> Hi,
> 
> openssh-1.2.2p1 seems to have 2 problems on ipv6 (and
> ipv4 mapped addresses).
> 
>  1. "BREAKIN ATTEMPT" warnings from ipv4 node
>  2. X forwarding

How does this patch look to you?

Regards,
Damien Miller

--
| "Bombay is 250ms from New York in the new world order" - Alan Cox
| Damien Miller - http://www.mindrot.org/
| Email: djm at mindrot.org (home) -or- djm at ibs.com.au (work)


-------------- next part --------------
Index: acconfig.h
===================================================================
RCS file: /var/cvs/openssh/acconfig.h,v
retrieving revision 1.53
diff -u -r1.53 acconfig.h
--- acconfig.h	2000/03/09 11:31:13	1.53
+++ acconfig.h	2000/03/11 09:38:46
@@ -153,6 +153,12 @@
 /* getaddrinfo is broken (if present) */
 #undef BROKEN_GETADDRINFO
 
+/* Workaround more Linux IPv6 bugs */
+#undef DONT_TRY_OTHER_AF
+
+/* Detect IPv4 in IPv6 mapped addresses and treat as IPv4 */
+#undef IPV4_IN_IPV6
+
 @BOTTOM@
 
 /* ******************* Shouldn't need to edit below this line ************** */
Index: canohost.c
===================================================================
RCS file: /var/cvs/openssh/canohost.c,v
retrieving revision 1.7
diff -u -r1.7 canohost.c
--- canohost.c	2000/01/14 04:45:48	1.7
+++ canohost.c	2000/03/11 09:38:49
@@ -42,6 +42,30 @@
 		debug("getpeername failed: %.100s", strerror(errno));
 		fatal_cleanup();
 	}
+
+#ifdef IPV4_IN_IPV6
+	if (from.ss_family == AF_INET6) {
+		struct sockaddr_in6 *from6 = (struct sockaddr_in6 *)&from;
+
+		/* Detect IPv4 in IPv6 mapped address and convert it to */
+		/* plain (AF_INET) IPv4 address */
+		if (IN6_IS_ADDR_V4MAPPED(&from6->sin6_addr)) {
+			struct sockaddr_in *from4 = (struct sockaddr_in *)&from;
+			struct in_addr addr;
+			u_int16_t port;
+
+			memcpy(&addr, ((char *)&from6->sin6_addr) + 12, sizeof(addr));
+			port = from6->sin6_port;
+
+			memset(&from, 0, sizeof(from));
+			
+			from4->sin_family = AF_INET;
+			memcpy(&from4->sin_addr, &addr, sizeof(addr));
+			from4->sin_port = port;
+		}
+	}
+#endif
+
 	if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop),
 	     NULL, 0, NI_NUMERICHOST) != 0)
 		fatal("get_remote_hostname: getnameinfo NI_NUMERICHOST failed");
Index: channels.c
===================================================================
RCS file: /var/cvs/openssh/channels.c,v
retrieving revision 1.17
diff -u -r1.17 channels.c
--- channels.c	2000/03/03 11:35:33	1.17
+++ channels.c	2000/03/11 09:39:12
@@ -1215,8 +1215,12 @@
 				break;
 			}
 			socks[num_socks++] = sock;
+#ifndef DONT_TRY_OTHER_AF
 			if (num_socks == NUM_SOCKS)
 				break;
+#else
+			break;
+#endif
 		}
 		if (num_socks > 0)
 			break;
Index: configure.in
===================================================================
RCS file: /var/cvs/openssh/configure.in,v
retrieving revision 1.93
diff -u -r1.93 configure.in
--- configure.in	2000/03/11 09:05:12	1.93
+++ configure.in	2000/03/11 09:39:22
@@ -55,6 +55,8 @@
 	;;
 *-*-linux*)
 	no_dev_ptmx=1
+	AC_DEFINE(DONT_TRY_OTHER_AF)
+	inet6_default_4in6=yes
 	;;
 *-*-netbsd*)
 	need_dash_r=1
@@ -784,6 +786,26 @@
 	[
 		if test "x$withval" != "xno" ; then	
 			AC_DEFINE(IPV4_DEFAULT)
+		fi
+	]
+)
+
+AC_MSG_CHECKING([to convert IPv4 in IPv6-mapped addresses])
+AC_ARG_WITH(4in6,
+	[  --with-4in6             Check for and convert IPv4 in IPv6 mapped addresses],
+	[
+		if test "x$withval" != "xno" ; then
+			AC_MSG_RESULT(yes)
+			AC_DEFINE(IPV4_IN_IPV6)
+		else
+			AC_MSG_RESULT(no)
+		fi
+	],[
+		if test "x$inet6_default_4in6" = "xyes"; then
+			AC_MSG_RESULT([yes (default)])
+			AC_DEFINE(IPV4_IN_IPV6)
+		else
+			AC_MSG_RESULT([no (default)])
 		fi
 	]
 )


More information about the openssh-unix-dev mailing list