Patch src/usr.bin/nc/socks.c to consume complete socks IPv6 reply.

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Patch src/usr.bin/nc/socks.c to consume complete socks IPv6 reply.

John Wright-6
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,