diff options
author | okan <> | 2011-02-12 15:54:18 +0000 |
---|---|---|
committer | okan <> | 2011-02-12 15:54:18 +0000 |
commit | d1c27f232cfde582e176b277933b485ea84ac845 (patch) | |
tree | 354cb6c523591b1733d85579a2bfc4a9957b9af5 | |
parent | b35fdb6ff39ff4535528cc5246fd9dbe3465eed4 (diff) | |
download | openbsd-d1c27f232cfde582e176b277933b485ea84ac845.tar.gz openbsd-d1c27f232cfde582e176b277933b485ea84ac845.tar.bz2 openbsd-d1c27f232cfde582e176b277933b485ea84ac845.zip |
fix from pr 6207. a bit more of an explanation: we write the correct
number of bits when connecting via a SOCKS 5 proxy over ipv6, but we
also need to read the same number depending on the received address
type. this issue is not noticeable with ssh's SOCKS 5 support since it
always set the address type as ipv4. this fixes connections via SOCKS 5
proxies which set their address type as ipv6 when using ipv6.
after review with, and ok, nicm@
-rw-r--r-- | src/usr.bin/nc/socks.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/usr.bin/nc/socks.c b/src/usr.bin/nc/socks.c index b38dff741e..71108d543b 100644 --- a/src/usr.bin/nc/socks.c +++ b/src/usr.bin/nc/socks.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: socks.c,v 1.18 2010/04/20 07:26:35 nicm Exp $ */ | 1 | /* $OpenBSD: socks.c,v 1.19 2011/02/12 15:54:18 okan Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 1999 Niklas Hallqvist. All rights reserved. | 4 | * Copyright (c) 1999 Niklas Hallqvist. All rights reserved. |
@@ -222,11 +222,25 @@ socks_connect(const char *host, const char *port, | |||
222 | if (cnt != wlen) | 222 | if (cnt != wlen) |
223 | err(1, "write failed (%zu/%zu)", cnt, wlen); | 223 | err(1, "write failed (%zu/%zu)", cnt, wlen); |
224 | 224 | ||
225 | cnt = atomicio(read, proxyfd, buf, 10); | 225 | cnt = atomicio(read, proxyfd, buf, 4); |
226 | if (cnt != 10) | 226 | if (cnt != 4) |
227 | err(1, "read failed (%zu/10)", cnt); | 227 | err(1, "read failed (%zu/4)", cnt); |
228 | if (buf[1] != 0) | 228 | if (buf[1] != 0) |
229 | errx(1, "connection failed, SOCKS error %d", buf[1]); | 229 | errx(1, "connection failed, SOCKS error %d", buf[1]); |
230 | switch (buf[3]) { | ||
231 | case SOCKS_IPV4: | ||
232 | cnt = atomicio(read, proxyfd, buf + 4, 6); | ||
233 | if (cnt != 6) | ||
234 | err(1, "read failed (%d/6)", cnt); | ||
235 | break; | ||
236 | case SOCKS_IPV6: | ||
237 | cnt = atomicio(read, proxyfd, buf + 4, 18); | ||
238 | if (cnt != 18) | ||
239 | err(1, "read failed (%d/18)", cnt); | ||
240 | break; | ||
241 | default: | ||
242 | errx(1, "connection failed, unsupported address type"); | ||
243 | } | ||
230 | } else if (socksv == 4) { | 244 | } else if (socksv == 4) { |
231 | /* This will exit on lookup failure */ | 245 | /* This will exit on lookup failure */ |
232 | decode_addrport(host, port, (struct sockaddr *)&addr, | 246 | decode_addrport(host, port, (struct sockaddr *)&addr, |