I've just been trying to update a socks server to support IPv6 and found
that nc wasn't consuming all of the socks connect reply.  I think that this
patch fixes this.

Index: socks.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/socks.c,v
retrieving revision 1.17
diff -u -p socks.c
--- socks.c     25 Sep 2006 04:51:20 -0000      1.17
+++ socks.c     3 Jun 2009 13:13:07 -0000
@@ -222,11 +222,24 @@ socks_connect(const char *host, const char *port,
                if (cnt != wlen)
                        err(1, "write failed (%d/%d)", cnt, wlen);
 
-               cnt = atomicio(read, proxyfd, buf, 10);
-               if (cnt != 10)
-                       err(1, "read failed (%d/10)", cnt);
+               cnt = atomicio(read, proxyfd, buf, 4);
+               if (cnt != 4)
+                       err(1, "read failed (%d/4)", cnt);
                if (buf[1] != 0)
                        errx(1, "connection failed, SOCKS error %d", buf[1]);
+               switch (buf[3])
+               {
+                       case SOCKS_IPV4:
+                               cnt = atomicio(read, proxyfd, buf + 4, 6);
+                               if (cnt != 6)
+                                       err(1, "read failed (%d/6)", cnt);
+                               break;
+                       case SOCKS_IPV6:
+                               cnt = atomicio(read, proxyfd, buf + 4, 18);
+                               if (cnt != 18)
+                                       err(1, "read failed (%d/18)", cnt);
+                               break;
+               }
        } else if (socksv == 4) {
                /* This will exit on lookup failure */
                decode_addrport(host, port, (struct sockaddr *)&addr,

Reply via email to