From 4169cab396ff364c0c43f49cdb8d855dadb59c39 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Thu, 18 Jun 2015 15:26:40 +0000 Subject: [PATCH 1/1] Increase socks5_connect()'s optimism MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit ... and let it send the request body optimistically as well. It's not that complicated and, more importantly, previously the request body wasn't guaranteed to be sent at all. Should fix #1686 reported by Peter Müller and G4JC. --- gateway.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/gateway.c b/gateway.c index 81b9b81a..60f2aa20 100644 --- a/gateway.c +++ b/gateway.c @@ -1,4 +1,4 @@ -const char gateway_rcs[] = "$Id: gateway.c,v 1.92 2012/10/23 10:16:52 fabiankeil Exp $"; +const char gateway_rcs[] = "$Id: gateway.c,v 1.93 2012/12/07 12:45:20 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/gateway.c,v $ @@ -67,6 +67,7 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.92 2012/10/23 10:16:52 fabiankeil #include "gateway.h" #include "miscutil.h" #include "list.h" +#include "parsers.h" #ifdef FEATURE_CONNECTION_KEEP_ALIVE #ifdef HAVE_POLL @@ -1082,14 +1083,11 @@ static jb_socket socks5_connect(const struct forward_spec *fwd, } /* - * Optimistically send the request headers with the initial - * request if the user requested use of Tor extensions, the - * CONNECT method isn't being used (in which case the client + * Optimistically send the HTTP request with the initial + * SOCKS request if the user enabled the use of Tor extensions, + * the CONNECT method isn't being used (in which case the client * doesn't send data until it gets our 200 response) and the - * client request has been already read completely. - * - * Not optimistically sending the request body (if there is one) - * makes it easier to implement, but isn't an actual requirement. + * client request has actually been completely read already. */ if ((fwd->type == SOCKS_5T) && (csp->http->ssl == 0) && (csp->flags & CSP_FLAG_CLIENT_REQUEST_COMPLETELY_READ)) @@ -1116,6 +1114,23 @@ static jb_socket socks5_connect(const struct forward_spec *fwd, return(JB_INVALID_SOCKET); } freez(client_headers); + if (csp->expected_client_content_length != 0) + { + unsigned long long buffered_request_bytes = + (unsigned long long)(csp->client_iob->eod - csp->client_iob->cur); + log_error(LOG_LEVEL_CONNECT, + "Optimistically sending %d bytes of client body. Expected %d", + csp->expected_client_content_length, buffered_request_bytes); + assert(csp->expected_client_content_length == buffered_request_bytes); + if (write_socket(sfd, csp->client_iob->cur, buffered_request_bytes)) + { + log_error(LOG_LEVEL_CONNECT, + "optimistically writing %d bytes of client body to: %s failed: %E", + buffered_request_bytes, csp->http->hostport); + return(JB_INVALID_SOCKET); + } + clear_iob(csp->client_iob); + } } server_size = read_socket(sfd, sbuf, sizeof(sbuf)); -- 2.39.2