[tor-commits] [tor-browser/tor-browser-52.6.0esr-8.0-2] Bug 19910: Rip out optimistic data socks handshake variant (#3875)
gk at torproject.org
gk at torproject.org
Mon Feb 19 15:26:28 UTC 2018
commit 67fa1e520d8cfc420f5bdee4b53b8310df18a977
Author: Kathy Brade <brade at pearlcrescent.com>
Date: Wed Feb 14 10:39:42 2018 -0500
Bug 19910: Rip out optimistic data socks handshake variant (#3875)
This has been shown to cause problems with STARTTLS in XMPP (used
in Tor Messenger) and with Tor Launcher's Moat client. A replacement
will be added to the Tor daemon itself via bug 5915 (Write patch to
make socks handshakes succeed instantly).
---
netwerk/base/nsSocketTransport2.cpp | 44 ++++++++-----------------------------
netwerk/base/nsSocketTransport2.h | 4 +---
netwerk/socket/nsSOCKSIOLayer.cpp | 3 +--
3 files changed, 11 insertions(+), 40 deletions(-)
diff --git a/netwerk/base/nsSocketTransport2.cpp b/netwerk/base/nsSocketTransport2.cpp
index 4399465fe534..1bfd1fc91525 100644
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -1983,26 +1983,7 @@ nsSocketTransport::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
// Update poll timeout in case it was changed
mPollTimeout = mTimeouts[TIMEOUT_READ_WRITE];
}
- // Tor 3875: Use optimistic data with SOCKS.
- // To accomplish this, two new states were added that are only used with
- // SOCKS connections:
- // STATE_SENDINGGET - The SOCKS handshake has proceeded to the
- // "sent connect" state; now it is okay to
- // optimistically send some application data (e.g.,
- // an HTTP GET request).
- // STATE_SENTGET - Optimistic data has been sent; make a second call
- // to PR_ConnectContinue() to allow the SOCKS
- // handshake to finish.
- else if (mState == STATE_SENDINGGET) {
- if ((mPollFlags & PR_POLL_WRITE) && (outFlags & ~PR_POLL_READ)) {
- mOutput.OnSocketReady(NS_OK); // Allow application data to be sent.
- }
- mPollTimeout = mTimeouts[TIMEOUT_READ_WRITE];
- mPollFlags = (PR_POLL_EXCEPT | PR_POLL_READ);
- mState = STATE_SENTGET; // Wait for SOCKS handshake response.
- }
- else if (((mState == STATE_CONNECTING) || (mState = STATE_SENTGET)) &&
- !gIOService->IsNetTearingDown()) {
+ else if ((mState == STATE_CONNECTING) && !gIOService->IsNetTearingDown()) {
// We do not need to do PR_ConnectContinue when we are already
// shutting down.
@@ -2026,14 +2007,7 @@ nsSocketTransport::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
Telemetry::PRCONNECTCONTINUE_BLOCKING_TIME_OFFLINE);
}
- bool isUsingSocks = mProxyTransparent && !mProxyHost.IsEmpty();
- if (status == PR_SUCCESS && mState == STATE_CONNECTING) {
- OnSocketConnected();
- if (isUsingSocks) {
- mState = STATE_SENDINGGET;
- }
- }
- else if (status == PR_SUCCESS && mState == STATE_SENTGET) {
+ if (status == PR_SUCCESS) {
//
// we are connected!
//
@@ -2060,17 +2034,17 @@ nsSocketTransport::OnSocketReady(PRFileDesc *fd, int16_t outFlags)
// If the connect is still not ready, then continue polling...
//
if ((PR_WOULD_BLOCK_ERROR == code) || (PR_IN_PROGRESS_ERROR == code)) {
- if (mState != STATE_SENTGET) {
- // Set up the select flags for connect...
- mPollFlags = (PR_POLL_EXCEPT | PR_POLL_WRITE);
- // Update poll timeout in case it was changed
- mPollTimeout = mTimeouts[TIMEOUT_CONNECT];
- }
+ // Set up the select flags for connect...
+ mPollFlags = (PR_POLL_EXCEPT | PR_POLL_WRITE);
+ // Update poll timeout in case it was changed
+ mPollTimeout = mTimeouts[TIMEOUT_CONNECT];
}
//
// The SOCKS proxy rejected our request. Find out why.
//
- else if (PR_UNKNOWN_ERROR == code && isUsingSocks) {
+ else if (PR_UNKNOWN_ERROR == code &&
+ mProxyTransparent &&
+ !mProxyHost.IsEmpty()) {
code = PR_GetOSError();
mCondition = ErrorAccordingToNSPR(code);
}
diff --git a/netwerk/base/nsSocketTransport2.h b/netwerk/base/nsSocketTransport2.h
index b4baed233ff1..7c85ccdc409f 100644
--- a/netwerk/base/nsSocketTransport2.h
+++ b/netwerk/base/nsSocketTransport2.h
@@ -201,9 +201,7 @@ private:
STATE_IDLE,
STATE_RESOLVING,
STATE_CONNECTING,
- STATE_TRANSFERRING,
- STATE_SENDINGGET,
- STATE_SENTGET
+ STATE_TRANSFERRING
};
// Safer way to get and automatically release PRFileDesc objects.
diff --git a/netwerk/socket/nsSOCKSIOLayer.cpp b/netwerk/socket/nsSOCKSIOLayer.cpp
index a21dfa4a5a11..5429637c1c3a 100644
--- a/netwerk/socket/nsSOCKSIOLayer.cpp
+++ b/netwerk/socket/nsSOCKSIOLayer.cpp
@@ -83,8 +83,7 @@ public:
void SetConnectTimeout(PRIntervalTime to);
PRStatus DoHandshake(PRFileDesc *fd, int16_t oflags = -1);
int16_t GetPollFlags() const;
- bool IsConnected() const { return (mState == SOCKS_CONNECTED ||
- mState == SOCKS5_READ_CONNECT_RESPONSE_TOP); }
+ bool IsConnected() const { return mState == SOCKS_CONNECTED; }
void ForgetFD() { mFD = nullptr; }
void SetNamedPipeFD(PRFileDesc *fd) { mFD = fd; }
More information about the tor-commits
mailing list