Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 May 2000 19:35:26 +0900
From:      Hajimu UMEMOTO (=?ISO-2022-JP?B?GyRCR19LXBsoQiA=?=  =?ISO-2022-JP?B?GyRCSCUbKEI=?=) <ume@bisd.hitachi.co.jp>
To:        andrews@technologist.com
Cc:        ume@bisd.hitachi.co.jp
Subject:   Re: ftp(1) breakage w/ passive mode?
Message-ID:  <20000529193526V.ume@bisd.hitachi.co.jp>
In-Reply-To: <20000528210423.F10345@argon.gryphonsoft.com>
References:  <20000528190327.C10345@argon.gryphonsoft.com> <200005290054.e4T0s2446726@cwsys.cwsent.com> <20000528210423.F10345@argon.gryphonsoft.com>

next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Mon_May_29_19:35:22_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

>>>>> On Sun, 28 May 2000 21:04:23 -0400
>>>>> Will Andrews <andrews@technologist.com> said:

> What would make ftp(1) think it has an IPv6 connection?

andrews> I have no idea..

It seems ftp(1) think using IPv6.

There is a bug in existing getaddrinfo().  getaddrinfo() returns IPv4
address as IPv4 mapped IPv6 address in some case.  It occures when:

	- INET6 is enabled in kernel
	- host has A RR and AAAA RR

IPv4 connection via mapped address is still IPv6 connection.  In this
case, if ftp(1) doesn't have awareness of using mapped address, your
problem will occur.  And, ftp(1) seems not aware about it.

But, it seems ftp.FreeBSD.org does't have AAAA RR.  So, I believe it
is not applicable to your case.  And, actually I dont' see this
problem here.  However, I have no idea without this case.  So, I
attach the patch to solve getaddrinfo() problem.  Please try it and I
would like to hear the result.


----Next_Part(Mon_May_29_19:35:22_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: getaddrinfo-mapped-workaround.diff
Content-Disposition: attachment;
 filename="getaddrinfo-mapped-workaround.diff"

Index: lib/libc/net/getaddrinfo.c
diff -u lib/libc/net/getaddrinfo.c.orig lib/libc/net/getaddrinfo.c
--- lib/libc/net/getaddrinfo.c.orig	Thu Apr 20 12:31:40 2000
+++ lib/libc/net/getaddrinfo.c	Mon Apr 24 21:41:24 2000
@@ -148,6 +148,7 @@
 static int get_portmatch __P((const struct addrinfo *, const char *));
 static int get_port __P((struct addrinfo *, const char *, int));
 static const struct afd *find_afd __P((int));
+static void unmappedaddr __P((struct addrinfo *));
 
 static char *ai_errlist[] = {
 	"Success",
@@ -512,6 +513,7 @@
 			 */
 			GET_CANONNAME(cur->ai_next, hp->h_name);
 		}
+		unmappedaddr(cur->ai_next);
 
 		while (cur && cur->ai_next)
 			cur = cur->ai_next;
@@ -903,4 +905,25 @@
 			return afd;
 	}
 	return NULL;
+}
+
+static void
+unmappedaddr(struct addrinfo *res)
+{
+	struct sockaddr_in6 *sin6;
+	struct sockaddr_in *sin;
+	u_int32_t addr;
+	int port;
+
+	sin6 = (struct sockaddr_in6 *)res->ai_addr;
+	if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
+		sin = (struct sockaddr_in *)res->ai_addr;
+		addr = *(u_int32_t *)&sin6->sin6_addr.s6_addr[12];
+		port = sin6->sin6_port;
+		memset(res->ai_addr, 0, res->ai_addrlen);
+		sin->sin_addr.s_addr = addr;
+		sin->sin_port = port;
+		sin->sin_family = res->ai_family = AF_INET;
+		sin->sin_len = res->ai_addrlen = sizeof(struct sockaddr_in);
+	}
 }

----Next_Part(Mon_May_29_19:35:22_2000_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: My Signature
Content-Disposition: attachment; filename=".signature-world"

Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume@mahoroba.org  ume@bisd.hitachi.co.jp  ume@FreeBSD.org
http://www.imasy.org/~ume/

----Next_Part(Mon_May_29_19:35:22_2000_809)----


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000529193526V.ume>