lftp-devel  

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

Arkadiusz Miskiewicz
Tue, 27 Jan 2009 06:06:09 -0800

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:
>
> [ar...@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/