The colons used in IPv6 addresses conflicts with the proxy port
specification.  Do the right thing for -x ::1:8080, [::1] and
[::1]:8080.

ok?


Index: netcat.c
===================================================================
RCS file: /d/cvs/src/usr.bin/nc/netcat.c,v
retrieving revision 1.171
diff -u -p -p -u -r1.171 netcat.c
--- netcat.c    30 Nov 2016 07:56:23 -0000      1.171
+++ netcat.c    4 Feb 2017 23:24:42 -0000
@@ -148,8 +148,8 @@ main(int argc, char *argv[])
        struct servent *sv;
        socklen_t len;
        struct sockaddr_storage cliaddr;
-       char *proxy;
-       const char *errstr, *proxyhost = "", *proxyport = NULL;
+       char *proxy, *proxyport = NULL;
+       const char *errstr;
        struct addrinfo proxyhints;
        char unix_dg_tmp_socket_buf[UNIX_DG_TMP_SOCKET_SIZE];
        struct tls_config *tls_cfg = NULL;
@@ -426,15 +426,29 @@ main(int argc, char *argv[])
                if (family == AF_UNIX)
                        errx(1, "no proxy support for unix sockets");
 
-               /* XXX IPv6 transport to proxy would probably work */
-               if (family == AF_INET6)
-                       errx(1, "no proxy support for IPv6");
-
                if (sflag)
                        errx(1, "no proxy support for local source address");
 
-               proxyhost = strsep(&proxy, ":");
-               proxyport = proxy;
+               if (*proxy == '[') {
+                       ++proxy;
+                       proxyport = strchr(proxy, ']');
+                       if (proxyport == NULL)
+                               errx(1, "missing closing bracket in proxy");
+                       *proxyport++ = '\0';
+                       if (*proxyport == '\0')
+                               /* Use default proxy port. */
+                               proxyport = NULL;
+                       else {
+                               if (*proxyport == ':')
+                                       ++proxyport;
+                               else
+                                       errx(1, "garbage proxy port delimiter");
+                       }
+               } else {
+                       proxyport = strrchr(proxy, ':');
+                       if (proxyport != NULL)
+                               *proxyport++ = '\0';
+               }
 
                memset(&proxyhints, 0, sizeof(struct addrinfo));
                proxyhints.ai_family = family;
@@ -617,7 +631,7 @@ main(int argc, char *argv[])
                        }
                        if (xflag)
                                s = socks_connect(host, portlist[i], hints,
-                                   proxyhost, proxyport, proxyhints, socksv,
+                                   proxy, proxyport, proxyhints, socksv,
                                    Pflag);
                        else
                                s = remote_connect(host, portlist[i], hints);
-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to