Re: SOCK5 crash+fix

Steffen Nurpmeso <[email protected]>
Newsgroups gmane.comp.web.lynx.devel
Message-ID <20220310182221._3nat%[email protected]>
Hello.

I was the original author of the $SOCKS5_PROXY patch, but for one
Thomas Dickey changed the C enormously, and i also have forgotten
anything about it, but you noting it made me look.

which had a 
Gisle Vanem wrote in
 <[email protected]>:
 |While trying Lynx with Tor's SOCK5 proxy:
 |   lynx -dump -socks5_proxy=localhost:9050
 |       https://www.bbcweb3hytmzhn5d532owbu6oqadra5z3ar726vq5kgwwn6aucdccrad\
 |       .onion/
 |
 |(the BBC Homepage), I got a strange crash for this code:
 |    socks5_protocol = HTSprintf0(NULL,
 |                                 gettext("(for %s at %s) SOCKS5"),
 |                                 protocol, socks5_host);
 |
 |A NULL-ptr read which I fail to understand.

Ok you mean that function may return NULL in out-of-memory and
thus this condition should be checked.
Hm, but HTAlloc() bails fatally in this condition?

  if (ptr == 0)
      outofmem(__FILE__, "HTAlloc");

 |But simply replacing with:
 |    char socks5_buf [1000];
 |    ...
 |    snprintf(socks5_buf, sizeof(socks5_buf),
 |             gettext("(for %s at %s) SOCKS5"), protocol, socks5_host);
 |    protocol = socks5_buf;

..So this i do not buy.

 |plus some other patches to HTTCP.c (attached), Lynx+Tor
 |works on Windows-10. The diff is against the 2.9.0dev.10
 |version. Latest I believe (?)
 ...
 |--- orig/WWW/Library/Implementation/HTTCP.c 2021-06-09 01:44:43
 |+++ WWW/Library/Implementation/HTTCP.c      2022-03-10 14:11:59
 |@@ -1828,9 +1828,9 @@
 |     char *socks5_host = NULL;
 |     unsigned socks5_host_len = 0;
 |     int socks5_port;
 |+    char socks5_buf [1000];
 |     const char *socks5_orig_url;
 |     char *socks5_new_url = NULL;
 |-    char *socks5_protocol = NULL;
 |     int status = HT_OK;
 |     char *line = NULL;
 |     char *p1 = NULL;
 |@@ -1888,10 +1888,9 @@
 |  HTSACat(&socks5_new_url, socks5_proxy);
 |  url = socks5_new_url;
 |
 |-     socks5_protocol = HTSprintf0(NULL,
 |-                                  gettext("(for %s at %s) SOCKS5"),
 |-                                  protocol, socks5_host);
 |-     protocol = socks5_protocol;
 |+     snprintf(socks5_buf, sizeof(socks5_buf),
 |+              gettext("(for %s at %s) SOCKS5"), protocol, socks5_host);
 |+     protocol = socks5_buf;
 |}
 | #ifndef INET6
 |     /*

With the above said, this is unrelated and worse or worse :)

 |@@ -2032,8 +2031,10 @@
 |   *                      write  service  procedure.  This will be
 |   *                      the normal case.
 |   */
 |+     CTRACE((tfp, "connect(): status: %d, SOCK_ERRNO: %d\n", status, \
 |SOCKET_ERRNO));
 |+
 |  if ((status < 0) &&
 |-         (SOCKET_ERRNO == EINPROGRESS
 |+         (SOCKET_ERRNO == EINPROGRESS || SOCKET_ERRNO == 112
 | #ifdef EAGAIN
 ||| SOCKET_ERRNO == EAGAIN
 | #endif

I do not know what 112 is, but i have no idea of Windows, what
i know was 3.* and 95 B.  You are surely right.

 |@@ -2091,7 +2092,7 @@
 |    * If we suspend, then it is possible that select will be
 |    * interrupted.  Allow for this possibility.  - JED
 |    */
 |-             if ((ret == -1) && (errno == EINTR))
 |+             if ((ret == -1) && (SOCKET_ERRNO == EINTR))
 |       continue;
 |
 | #ifdef SOCKET_DEBUG_TRACE

This looks right to me given that SOCKER_ERRNO != errno there.

 |@@ -2273,7 +2281,7 @@
 |  pbuf[0] = 0x05;             /* VER: protocol version: X'05' */
 |  pbuf[1] = 0x01;             /* NMETHODS: 1 */
 |  pbuf[2] = 0x00;             /* METHOD: X'00' NO AUTHENTICATION REQUIRED \
 |  */
 |-     if (write(*s, pbuf, 3) != 3) {
 |+     if (NETWRITE(*s, pbuf, 3) != 3) {

Interesting!  This ... seems right then too?
I did not know this!

  ...

The below patch against [d84fd6821970236a99d0d38b1df98c74463cec02]
aka v2-9-0dev_10a, does it work for you too?
(Note i have not even compile-tested it, but .. should!!!)

diff --git a/WWW/Library/Implementation/HTTCP.c b/WWW/Library/Implementation/HTTCP.c
index c4d648acde..99f4620f2f 100644
--- a/WWW/Library/Implementation/HTTCP.c
+++ b/WWW/Library/Implementation/HTTCP.c
@@ -2036,6 +2036,9 @@ int HTDoConnect(const char *url,
 	    (SOCKET_ERRNO == EINPROGRESS
 #ifdef EAGAIN
 	     || SOCKET_ERRNO == EAGAIN
+#endif
+#ifdef _WINDOWS
+	     || SOCKET_ERRNO == 112
 #endif
 	    )) {
 	    struct timeval select_timeout;
@@ -2091,7 +2094,7 @@ int HTDoConnect(const char *url,
 		 * If we suspend, then it is possible that select will be
 		 * interrupted.  Allow for this possibility.  - JED
 		 */
-		if ((ret == -1) && (errno == EINTR))
+		if ((ret == -1) && (SOCKET_ERRNO == EINTR))
 		    continue;
 
 #ifdef SOCKET_DEBUG_TRACE
@@ -2273,7 +2276,7 @@ int HTDoConnect(const char *url,
 	pbuf[0] = 0x05;		/* VER: protocol version: X'05' */
 	pbuf[1] = 0x01;		/* NMETHODS: 1 */
 	pbuf[2] = 0x00;		/* METHOD: X'00' NO AUTHENTICATION REQUIRED */
-	if (write(*s, pbuf, 3) != 3) {
+	if (NETWRITE(*s, pbuf, 3) != 3) {
 	    goto report_system_err;
 	} else if (HTDoRead(*s, pbuf, 2) != 2) {
 	    goto report_system_err;
@@ -2298,7 +2301,7 @@ int HTDoConnect(const char *url,
 	    memcpy(&pbuf[i], (unsigned char *) &x, sizeof x);
 	    i += (unsigned) sizeof(x);
 	}
-	if ((size_t) write(*s, pbuf, i) != i) {
+	if ((size_t) NETWRITE(*s, pbuf, i) != i) {
 	    goto report_system_err;
 	} else if ((unsigned) HTDoRead(*s, pbuf, 4) != 4) {
 	    goto report_system_err;

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.