--- curl-7.15.6-20060828/lib/ftp.c	2006-08-23 04:00:39.000000000 +0200
+++ curl-7.15.6-20060828x/lib/ftp.c	2006-08-28 16:53:50.000000000 +0200
@@ -222,9 +222,11 @@ static CURLcode AllowServerConnect(struc
 #endif
       socklen_t size = (socklen_t) sizeof(add);
 
-      if(0 == getsockname(sock, (struct sockaddr *) &add, &size))
-        s=accept(sock, (struct sockaddr *) &add, &size);
+      if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) {
+	size = sizeof(add);
 
+        s=accept(sock, (struct sockaddr *) &add, &size);
+      }
       sclose(sock); /* close the first socket */
 
       if (CURL_SOCKET_BAD == s) {
@@ -835,16 +837,18 @@ static CURLcode ftp_state_use_port(struc
        the IP from the control connection */
 
     sslen = sizeof(ss);
-    rc = getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen);
-    if(rc < 0) {
-      failf(data, "getsockname() returned %d\n", rc);
+    if (getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen)) {
+      failf(data, "getsockname() failed: %s",
+          Curl_strerror(conn, Curl_sockerrno()) );
       return CURLE_FTP_PORT_FAILED;
     }
 
+    if (sslen > sizeof(ss))
+      sslen = sizeof(ss);
     rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf), NULL,
                      0, NIFLAGS);
     if(rc) {
-      failf(data, "getnameinfo() returned %d\n", rc);
+      failf(data, "getnameinfo() returned %d \n", rc);
       return CURLE_FTP_PORT_FAILED;
     }
     host = hbuf; /* use this host name */
@@ -889,14 +893,14 @@ static CURLcode ftp_state_use_port(struc
   /* step 3, bind to a suitable local address */
 
   /* Try binding the given address. */
-  if (bind(portsock, ai->ai_addr, ai->ai_addrlen) < 0) {
+  if (bind(portsock, ai->ai_addr, ai->ai_addrlen)) {
 
     /* It failed. Bind the address used for the control connection instead */
     sslen = sizeof(ss);
-
     if (getsockname(conn->sock[FIRSTSOCKET],
-                    (struct sockaddr *)sa, &sslen) < 0) {
-      failf(data, "getsockname() failed");
+                    (struct sockaddr *)sa, &sslen)) {
+      failf(data, "getsockname() failed: %s",
+          Curl_strerror(conn, Curl_sockerrno()) );
       sclose(portsock);
       return CURLE_FTP_PORT_FAILED;
     }
@@ -907,7 +911,10 @@ static CURLcode ftp_state_use_port(struc
     else
       ((struct sockaddr_in6 *)sa)->sin6_port =0;
 
-    if(bind(portsock, (struct sockaddr *)sa, sslen) < 0) {
+    if (sslen > sizeof(ss))
+      sslen = sizeof(ss);
+
+    if(bind(portsock, (struct sockaddr *)sa, sslen)) {
       failf(data, "bind failed: %s", Curl_strerror(conn, Curl_sockerrno()));
       sclose(portsock);
       return CURLE_FTP_PORT_FAILED;
@@ -917,18 +924,18 @@ static CURLcode ftp_state_use_port(struc
   /* get the name again after the bind() so that we can extract the
      port number it uses now */
   sslen = sizeof(ss);
-  if(getsockname(portsock, (struct sockaddr *)sa, &sslen)<0) {
+  if(getsockname(portsock, (struct sockaddr *)sa, &sslen)) {
     failf(data, "getsockname() failed: %s",
           Curl_strerror(conn, Curl_sockerrno()) );
+    sclose(portsock);
     return CURLE_FTP_PORT_FAILED;
   }
 
   /* step 4, listen on the socket */
 
-  if (listen(portsock, 1) < 0) {
-    error = Curl_sockerrno();
+  if (listen(portsock, 1)) {
+    failf(data, "socket failure: %s", Curl_strerror(conn, Curl_sockerrno()));
     sclose(portsock);
-    failf(data, "socket failure: %s", Curl_strerror(conn, error));
     return CURLE_FTP_PORT_FAILED;
   }
 
@@ -1024,6 +1031,7 @@ static CURLcode ftp_state_use_port(struc
   Curl_addrinfo *addr = NULL;
   unsigned short ip[4];
   bool freeaddr = TRUE;
+  socklen_t sslen = sizeof(sa);
 
   (void)fcmd; /* not used in the IPv4 code */
   if(data->set.ftpport) {
@@ -1067,14 +1075,15 @@ static CURLcode ftp_state_use_port(struc
   if(!addr) {
     /* pick a suitable default here */
 
-    socklen_t sslen;
-
-    sslen = sizeof(sa);
+ 
     if (getsockname(conn->sock[FIRSTSOCKET],
-                    (struct sockaddr *)&sa, &sslen) < 0) {
-      failf(data, "getsockname() failed");
+                    (struct sockaddr *)&sa, &sslen)) {
+      failf(data, "getsockname() failed: %s",
+          Curl_strerror(conn, Curl_sockerrno()) );
       return CURLE_FTP_PORT_FAILED;
     }
+    if (sslen>sizeof(sa))
+      sslen = sizeof(sa);
 
     sa_filled_in = TRUE; /* the sa struct is filled in */
   }
@@ -1082,7 +1091,6 @@ static CURLcode ftp_state_use_port(struc
   if (addr || sa_filled_in) {
     portsock = socket(AF_INET, SOCK_STREAM, 0);
     if(CURL_SOCKET_BAD != portsock) {
-      socklen_t size;
 
       /* we set the secondary socket variable to this for now, it
          is only so that the cleanup function will close it in case
@@ -1092,21 +1100,22 @@ static CURLcode ftp_state_use_port(struc
       conn->sock[SECONDARYSOCKET] = portsock;
 
       if(!sa_filled_in) {
-        memcpy(&sa, addr->ai_addr, sizeof(sa));
+        memcpy(&sa, addr->ai_addr, sslen);
         sa.sin_addr.s_addr = INADDR_ANY;
       }
 
       sa.sin_port = 0;
-      size = sizeof(sa);
+      sslen = sizeof(sa);
 
-      if(bind(portsock, (struct sockaddr *)&sa, size) >= 0) {
+      if(bind(portsock, (struct sockaddr *)&sa, sslen) == 0) {
         /* we succeeded to bind */
         struct sockaddr_in add;
         socklen_t socksize = sizeof(add);
 
         if(getsockname(portsock, (struct sockaddr *) &add,
-                       &socksize)<0) {
-          failf(data, "getsockname() failed");
+                       &socksize)) {
+          failf(data, "getsockname() failed: %s",
+            Curl_strerror(conn, Curl_sockerrno()) );
           return CURLE_FTP_PORT_FAILED;
         }
         porttouse = ntohs(add.sin_port);


