Re: [patch[ [bug report]: incorrect handlink of link-local IPv6 addresses

Arkadiusz Miskiewicz <[email protected]> Tue, 27 Jan 2009 14:53:08 +0100
Newsgroups gmane.network.lftp.devel
Message-ID <[email protected]>
On Tuesday 27 of January 2009, Arkadiusz Miskiewicz wrote:
> lftp 3.7.8
>
> When connecting to link-local IPv6 addressess we need to specify interface
> that's going to be used but lftp doesn't handle this correctly:
>
> [arekm@tarm ~]$ lftp ftp://fe80::2c0:9fff:feed:33cc%eth0
> lftp fe80::2c0:9fff:feed:33cc%eth0:~> debug 10
> lftp fe80::2c0:9fff:feed:33cc%eth0:~> ls
> ---- dns cache hit
> ---- Connecting to fe80::2c0:9fff:feed:33cc%eth0 (fe80::2c0:9fff:feed:33cc)
> port 21
> **** connect(control_sock): Invalid argument
> ---- Closing control socket
> ls: Invalid argument
> lftp fe80::2c0:9fff:feed:33cc%eth0:~> exit
> zsh: exit 1     lftp ftp://fe80::2c0:9fff:feed:33cc%eth0

Patch fixing issue:

diff -ur lftp-3.7.8.org/src/Resolver.cc lftp-3.7.8/src/Resolver.cc
--- lftp-3.7.8.org/src/Resolver.cc	2008-11-27 06:56:26.000000000 +0100
+++ lftp-3.7.8/src/Resolver.cc	2009-01-27 14:47:57.466736403 +0100
@@ -291,7 +291,7 @@
    done=true;
 }
 
-void Resolver::AddAddress(int family,const char *address,int len)
+void Resolver::AddAddress(int family,const char *address,int len, unsigned int scope)
 {
    sockaddr_u add;
    memset(&add,0,sizeof(add));
@@ -315,6 +315,7 @@
          return;
       memcpy(&add.in6.sin6_addr,address,len);
       add.in6.sin6_port=port_number;
+      add.in6.sin6_scope_id=scope;
 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
       add.sa.sa_len=sizeof(add.in6);
 #endif
@@ -693,6 +694,7 @@
       struct sockaddr_in6   *inet6_addr;
       const char	    *addr_data;
       int		    addr_len;
+      unsigned int          addr_scope;
 
       memset(&a_hint, 0, sizeof(a_hint));
       a_hint.ai_flags	    = AI_PASSIVE;
@@ -717,17 +719,19 @@
 	       case AF_INET:
 		  inet_addr   = (sockaddr_in *)sockname;
 		  addr_data   = (const char *)&(inet_addr->sin_addr.s_addr);
+		  addr_scope  = 0;
 		  addr_len    = sizeof(inet_addr->sin_addr.s_addr);
 		  break;
 	       case AF_INET6:
 		  inet6_addr  = (sockaddr_in6 *)sockname;
 		  addr_data   = (const char *)&(inet6_addr->sin6_addr.s6_addr);
+		  addr_scope  = inet6_addr->sin6_scope_id;
 		  addr_len    = sizeof(inet6_addr->sin6_addr.s6_addr);
 		  break;
 	       default:
 		  continue;
 	       }
-	       AddAddress(a_res->ai_family, addr_data, addr_len);
+	       AddAddress(a_res->ai_family, addr_data, addr_len, addr_scope);
 	    }
 	 }
 
@@ -773,7 +777,7 @@
       {
 	 const char * const *a;
 	 for(a=ha->h_addr_list; *a; a++)
-	    AddAddress(ha->h_addrtype, *a, ha->h_length);
+	    AddAddress(ha->h_addrtype, *a, ha->h_length, 0);
 	 retries=0;
 	 af_index++;
 # if defined(HAVE_GETIPNODEBYNAME)
diff -ur lftp-3.7.8.org/src/Resolver.h lftp-3.7.8/src/Resolver.h
--- lftp-3.7.8.org/src/Resolver.h	2008-11-27 06:56:27.000000000 +0100
+++ lftp-3.7.8/src/Resolver.h	2009-01-27 14:47:12.017783307 +0100
@@ -47,7 +47,7 @@
 
    xarray<sockaddr_u> addr;
 
-   void AddAddress(int family,const char *a,int len);
+   void AddAddress(int family,const char *a,int len,unsigned int scope);
 
    xstring err_msg;
    bool done;



-- 
Arkadiusz Miƛkiewicz        PLD/Linux Team
arekm / maven.pl            http://ftp.pld-linux.org/