Fixed parsing of an IPv6 proxy address to support a scope identifier,
authorDan Fandrich <dan@coneharvesters.com>
Thu, 31 Jul 2008 20:04:00 +0000 (20:04 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Thu, 31 Jul 2008 20:04:00 +0000 (20:04 +0000)
as well as IPv4 addresses in IPv6 format. Also, better handle the case
of a malformatted IPv6 address (avoid empty and NULL strings).

CHANGES
docs/MANUAL
lib/url.c

diff --git a/CHANGES b/CHANGES
index 2f3e8c5..1970b56 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@
 
                                   Changelog
 
+Daniel Fandrich (31 Jul 2008)
+- Fixed parsing of an IPv6 proxy address to support a scope identifier,
+  as well as IPv4 addresses in IPv6 format. Also, better handle the case
+  of a malformatted IPv6 address (avoid empty and NULL strings).
+
 Daniel Stenberg (30 Jul 2008)
 - Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL
   parser to allow numerical IPv6-addresses to be specified with the scope
index 30a9322..3b1195c 100644 (file)
@@ -904,6 +904,9 @@ IPv6
 
     sftp://[fe80::1234%251]/
 
+  IPv6 addresses provided other than in URLs (e.g. to the --proxy, --interface
+  or --ftp-port options) should not be URL encoded.
+
 
 MAILING LISTS
 
index e39a3d2..2aec565 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -3102,7 +3102,8 @@ static CURLcode ParseURLAndFillConnection(struct SessionHandle *data,
         if (!data->state.this_is_a_follow)
           /* Don't honour a scope given in a Location: header */
           conn->scope = scope;
-      }
+      } else
+        infof(data, "Invalid IPv6 address format\n");
     }
   }
 
@@ -3406,13 +3407,14 @@ static CURLcode parse_proxy(struct SessionHandle *data,
   /* detect and extract RFC2732-style IPv6-addresses */
   if(*proxyptr == '[') {
     char *ptr = ++proxyptr; /* advance beyond the initial bracket */
-    while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':')))
+    while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '%') || (*ptr == '.')))
       ptr++;
     if(*ptr == ']') {
       /* yeps, it ended nicely with a bracket as well */
-      *ptr = 0;
-      portptr = ptr+1;
-    }
+      *ptr++ = 0;
+    } else
+      infof(data, "Invalid IPv6 address format\n");
+    portptr = ptr;
     /* Note that if this didn't end with a bracket, we still advanced the
      * proxyptr first, but I can't see anything wrong with that as no host
      * name nor a numeric can legally start with a bracket.