Browse Source

TLS: Finer locks on _cycle.

Data being sent out of order.
v0.7.4-release
Theo Schlossnagle 14 years ago
committed by Ryan Dahl
parent
commit
e3925b741c
  1. 40
      lib/tls.js

40
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);
}
};

Loading…
Cancel
Save