aboutsummaryrefslogtreecommitdiff
path: root/regress/netcat.c
diff options
context:
space:
mode:
Diffstat (limited to 'regress/netcat.c')
-rw-r--r--regress/netcat.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/regress/netcat.c b/regress/netcat.c
index 20ec3f5954fa..c62111780636 100644
--- a/regress/netcat.c
+++ b/regress/netcat.c
@@ -55,13 +55,7 @@
#include <unistd.h>
#include "atomicio.h"
-#ifdef HAVE_POLL_H
#include <poll.h>
-#else
-# ifdef HAVE_SYS_POLL_H
-# include <sys/poll.h>
-# endif
-#endif
#ifdef HAVE_ERR_H
# include <err.h>
#endif
@@ -185,6 +179,8 @@ main(int argc, char *argv[])
socksv = -1; /* HTTP proxy CONNECT */
else if (strcmp(optarg, "4") == 0)
socksv = 4; /* SOCKS v.4 */
+ else if (strcasecmp(optarg, "4A") == 0)
+ socksv = 44; /* SOCKS v.4A */
else if (strcmp(optarg, "5") == 0)
socksv = 5; /* SOCKS v.5 */
else
@@ -1138,7 +1134,7 @@ build_ports(char *p)
char *c;
for (x = 0; x <= (hi - lo); x++) {
- y = (arc4random() & 0xFFFF) % (hi - lo);
+ y = arc4random_uniform(hi - lo);
c = portlist[x];
portlist[x] = portlist[y];
portlist[y] = c;
@@ -1586,19 +1582,33 @@ socks_connect(const char *host, const char *port,
default:
errx(1, "connection failed, unsupported address type");
}
- } else if (socksv == 4) {
- /* This will exit on lookup failure */
- decode_addrport(host, port, (struct sockaddr *)&addr,
- sizeof(addr), 1, 0);
+ } else if (socksv == 4 || socksv == 44) {
+ if (socksv == 4) {
+ /* This will exit on lookup failure */
+ decode_addrport(host, port, (struct sockaddr *)&addr,
+ sizeof(addr), 1, 0);
+ }
/* Version 4 */
buf[0] = SOCKS_V4;
buf[1] = SOCKS_CONNECT; /* connect */
memcpy(buf + 2, &in4->sin_port, sizeof in4->sin_port);
- memcpy(buf + 4, &in4->sin_addr, sizeof in4->sin_addr);
+ if (socksv == 4) {
+ memcpy(buf + 4, &in4->sin_addr, sizeof in4->sin_addr);
+ } else {
+ /* SOCKS4A uses addr of 0.0.0.x, and hostname later */
+ buf[4] = buf[5] = buf[6] = 0;
+ buf[7] = 1;
+ }
buf[8] = 0; /* empty username */
wlen = 9;
-
+ if (socksv == 44) {
+ /* SOCKS4A has nul-terminated hostname after user */
+ if (strlcpy(buf + 9, host,
+ sizeof(buf) - 9) >= sizeof(buf) - 9)
+ errx(1, "hostname too big");
+ wlen = 9 + strlen(host) + 1;
+ }
cnt = atomicio(vwrite, proxyfd, buf, wlen);
if (cnt != wlen)
err(1, "write failed (%zu/%zu)", cnt, wlen);