mirror of https://github.com/nodejs/node.git
TLS: Finer locks on _cycle.
Data being sent out of order.
This commit is contained in:
parent
2e40328c82
commit
e3925b741c
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;
|
||||
}
|
||||
|
||||
this._cycleLock = false;
|
||||
if (!this._cycleCleartextPullLock) {
|
||||
this._cycleCleartextPullLock = true;
|
||||
this.cleartext._pull();
|
||||
this._cycleCleartextPullLock = 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…
Reference in New Issue