From e3925b741ca1d063d350fc3419f54ab1e9fc4755 Mon Sep 17 00:00:00 2001 From: Theo Schlossnagle Date: Mon, 14 Mar 2011 12:04:00 -0700 Subject: [PATCH] TLS: Finer locks on _cycle. Data being sent out of order. --- lib/tls.js | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/tls.js b/lib/tls.js index a951c979f1..e8a6608e2f 100644 --- a/lib/tls.js +++ b/lib/tls.js @@ -508,33 +508,49 @@ exports.createSecurePair = function(credentials, * Because it is also called everywhere, we also check if the connection has * completed negotiation and emit 'secure' from here if it has. */ -SecurePair.prototype._cycle = function() { +SecurePair.prototype._cycle = function(depth) { + depth = depth ? depth : 0; if (this._done) { return; } - // Make this function reentrant. - if (this._cycleLock) return; - this._cycleLock = true; - this._writeCalled = false; + if(depth == 0) this._writeCalled = false; var established = this._secureEstablished; - this.encrypted._pull(); - this.cleartext._pull(); - this.cleartext._push(); - this.encrypted._push(); + if (!this._cycleEncryptedPullLock) { + this._cycleEncryptedPullLock = true; + this.encrypted._pull(); + this._cycleEncryptedPullLock = false; + } + + if (!this._cycleCleartextPullLock) { + this._cycleCleartextPullLock = true; + this.cleartext._pull(); + this._cycleCleartextPullLock = false; + } - this._cycleLock = false; + if (!this._cycleCleartextPushLock) { + this._cycleCleartextPushLock = true; + this.cleartext._push(); + this._cycleCleartextPushLock = false; + } + + if (!this._cycleEncryptedPushLock) { + this._cycleEncryptedPushLock = true; + this.encrypted._push(); + this._cycleEncryptedPushLock = false; + } if (this._done) { return; } - if ((!established && this._secureEstablished) || this._writeCalled) { + if ((!established && this._secureEstablished) || + (depth == 0 && this._writeCalled)) { // If we were not established but now we are, let's cycle again. // Or if there is some data to write... - this._cycle(); + this._cycle(depth + 1); } };