Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SOCKS strerrors for nc(1)

489 views
Skip to first unread message

Michael McConville

unread,
Nov 30, 2015, 9:37:58 PM11/30/15
to te...@openbsd.org, be...@openbsd.org
When an nc SOCKS connection fails, you get an error message like this:

> connection failed, SOCKS error 6

Obviously, this would be clearer with error strings.

ok?


Index: socks.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/socks.c,v
retrieving revision 1.21
diff -u -p -r1.21 socks.c
--- socks.c 26 Mar 2015 21:19:51 -0000 1.21
+++ socks.c 1 Dec 2015 02:31:46 -0000
@@ -122,6 +122,43 @@ getproxypass(const char *proxyuser, cons
return (pw);
}

+/*
+ * Error strings adapted from the generally accepted SOCKSv4 spec:
+ *
+ * http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
+ */
+static const char *
+socks4_strerror(int e)
+{
+ switch (e) {
+ case 90: return "Succeeded";
+ case 91: return "Request rejected or failed";
+ case 92: return "SOCKS server cannot connect to identd on the client";
+ case 93: return "Client program and identd report different user-ids";
+ default: return "Unknown error";
+ }
+}
+
+/*
+ * Error strings taken almost directly from RFC 1928.
+ */
+static const char *
+socks5_strerror(int e)
+{
+ switch (e) {
+ case 0: return "Succeeded";
+ case 1: return "General SOCKS server failure";
+ case 2: return "Connection not allowed by ruleset";
+ case 3: return "Network unreachable";
+ case 4: return "Host unreachable";
+ case 5: return "Connection refused";
+ case 6: return "TTL expired";
+ case 7: return "Command not supported";
+ case 8: return "Address type not supported";
+ default: return "Unknown error";
+ }
+}
+
int
socks_connect(const char *host, const char *port,
struct addrinfo hints __attribute__ ((__unused__)),
@@ -225,8 +262,10 @@ socks_connect(const char *host, const ch
cnt = atomicio(read, proxyfd, buf, 4);
if (cnt != 4)
err(1, "read failed (%zu/4)", cnt);
- if (buf[1] != 0)
- errx(1, "connection failed, SOCKS error %d", buf[1]);
+ if (buf[1] != 0) {
+ errx(1, "connection failed, SOCKS error: %s",
+ socks5_strerror(buf[1]));
+ }
switch (buf[3]) {
case SOCKS_IPV4:
cnt = atomicio(read, proxyfd, buf + 4, 6);
@@ -261,8 +300,10 @@ socks_connect(const char *host, const ch
cnt = atomicio(read, proxyfd, buf, 8);
if (cnt != 8)
err(1, "read failed (%zu/8)", cnt);
- if (buf[1] != 90)
- errx(1, "connection failed, SOCKS error %d", buf[1]);
+ if (buf[1] != 90) {
+ errx(1, "connection failed, SOCKS error: %s",
+ socks4_strerror(buf[1]));
+ }
} else if (socksv == -1) {
/* HTTP proxy CONNECT */


Theo de Raadt

unread,
Nov 30, 2015, 9:45:15 PM11/30/15
to Michael McConville, te...@openbsd.org, be...@openbsd.org
> +/*
> + * Error strings adapted from the generally accepted SOCKSv4 spec:
> + *
> + * http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
> + */
> +static const char *
> +socks4_strerror(int e)
> +{
> + switch (e) {
> + case 90: return "Succeeded";
> + case 91: return "Request rejected or failed";
> + case 92: return "SOCKS server cannot connect to identd on the client";
> + case 93: return "Client program and identd report different user-ids";
> + default: return "Unknown error";
> + }
> +}

Please KNF.

case 90:
return "Succeeded";
case 91:

etc.

Michael McConville

unread,
Nov 30, 2015, 10:03:45 PM11/30/15
to Theo de Raadt, te...@openbsd.org, be...@openbsd.org
Theo de Raadt wrote:
> Please KNF.
>
> case 90:
> return "Succeeded";
> case 91:
>
> etc.

New diff:


Index: socks.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/socks.c,v
retrieving revision 1.21
diff -u -p -r1.21 socks.c
--- socks.c 26 Mar 2015 21:19:51 -0000 1.21
+++ socks.c 1 Dec 2015 02:59:57 -0000
@@ -122,6 +122,58 @@ getproxypass(const char *proxyuser, cons
return (pw);
}

+/*
+ * Error strings adapted from the generally accepted SOCKSv4 spec:
+ *
+ * http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
+ */
+static const char *
+socks4_strerror(int e)
+{
+ switch (e) {
+ case 90:
+ return "Succeeded";
+ case 91:
+ return "Request rejected or failed";
+ case 92:
+ return "SOCKS server cannot connect to identd on the client";
+ case 93:
+ return "Client program and identd report different user-ids";
+ default:
+ return "Unknown error";
+ }
+}
+
+/*
+ * Error strings taken almost directly from RFC 1928.
+ */
+static const char *
+socks5_strerror(int e)
+{
+ switch (e) {
+ case 0:
+ return "Succeeded";
+ case 1:
+ return "General SOCKS server failure";
+ case 2:
+ return "Connection not allowed by ruleset";
+ case 3:
+ return "Network unreachable";
+ case 4:
+ return "Host unreachable";
+ case 5:
+ return "Connection refused";
+ case 6:
+ return "TTL expired";
+ case 7:
+ return "Command not supported";
+ case 8:
+ return "Address type not supported";
+ default:
+ return "Unknown error";
+ }
+}
+
int
socks_connect(const char *host, const char *port,
struct addrinfo hints __attribute__ ((__unused__)),
@@ -225,8 +277,10 @@ socks_connect(const char *host, const ch
cnt = atomicio(read, proxyfd, buf, 4);
if (cnt != 4)
err(1, "read failed (%zu/4)", cnt);
- if (buf[1] != 0)
- errx(1, "connection failed, SOCKS error %d", buf[1]);
+ if (buf[1] != 0) {
+ errx(1, "connection failed, SOCKS error: %s",
+ socks5_strerror(buf[1]));
+ }
switch (buf[3]) {
case SOCKS_IPV4:
cnt = atomicio(read, proxyfd, buf + 4, 6);
@@ -261,8 +315,10 @@ socks_connect(const char *host, const ch

Michael McConville

unread,
Dec 8, 2015, 12:27:06 PM12/8/15
to Theo de Raadt, te...@openbsd.org, be...@openbsd.org
Michael McConville wrote:
> Theo de Raadt wrote:
> > Please KNF.
> >
> > case 90:
> > return "Succeeded";
> > case 91:
> >
> > etc.
>
> New diff:

Thoughts, anyone?
0 new messages