Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ry/918661 to your computer and use it in GitHub Desktop.
Save ry/918661 to your computer and use it in GitHub Desktop.
From a7e8956e9d1fb7a425a6480efbcc3a1d399b7eab Mon Sep 17 00:00:00 2001
From: Ryan Dahl <ry@tinyclouds.org>
Date: Wed, 13 Apr 2011 13:54:47 -0700
Subject: [PATCH] CryptoStream.write returns false when queue > 128kb
Previously the return value of write was dependent on if it was paused or
not which was causing a strange error demoed in the previous commit.
Fixes #892
---
lib/tls.js | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/lib/tls.js b/lib/tls.js
index 96af640..0a41f05 100644
--- a/lib/tls.js
+++ b/lib/tls.js
@@ -54,13 +54,14 @@ function CryptoStream(pair) {
this._writeState = true;
this._pending = [];
this._pendingCallbacks = [];
+ this._pendingBytes = 0;
}
util.inherits(CryptoStream, stream.Stream);
CryptoStream.prototype.write = function(data /* , encoding, cb */) {
if (this == this.pair.cleartext) {
- debug('cleartext.write called with (((' + data.toString() + ')))');
+ debug('cleartext.write called with ' + data.length + ' bytes');
} else {
debug('encrypted.write called with ' + data.length + ' bytes');
}
@@ -90,10 +91,12 @@ CryptoStream.prototype.write = function(data /* , encoding, cb */) {
this._pending.push(data);
this._pendingCallbacks.push(cb);
+ this._pendingBytes += data.length;
+
this.pair._writeCalled = true;
this.pair._cycle();
- return this._writeState;
+ return this._pendingBytes < 128 * 1024;
};
@@ -263,7 +266,7 @@ CryptoStream.prototype._push = function() {
// Bail out if we didn't read any data.
if (bytesRead == 0) {
- if (this._pendingBytes() == 0 && this._destroyAfterPush) {
+ if (this._internallyPendingBytes() == 0 && this._destroyAfterPush) {
this._done();
}
return;
@@ -272,7 +275,7 @@ CryptoStream.prototype._push = function() {
var chunk = pool.slice(0, bytesRead);
if (this === this.pair.cleartext) {
- debug('cleartext emit "data" called with (((' + chunk.toString() + ')))');
+ debug('cleartext emit "data" with ' + bytesRead + ' bytes');
} else {
debug('encrypted emit "data" with ' + bytesRead + ' bytes');
}
@@ -307,6 +310,8 @@ CryptoStream.prototype._push = function() {
CryptoStream.prototype._pull = function() {
var havePending = this._pending.length > 0;
+ assert(havePending || this._pendingBytes == 0);
+
while (this._pending.length > 0) {
if (!this.pair._ssl) break;
@@ -355,6 +360,9 @@ CryptoStream.prototype._pull = function() {
break;
}
+ this._pendingBytes -= tmp.length;
+ assert(this._pendingBytes >= 0);
+
if (cb) cb();
assert(rv === tmp.length);
@@ -375,7 +383,7 @@ function CleartextStream(pair) {
util.inherits(CleartextStream, CryptoStream);
-CleartextStream.prototype._pendingBytes = function() {
+CleartextStream.prototype._internallyPendingBytes = function() {
if (this.pair._ssl) {
return this.pair._ssl.clearPending();
} else {
@@ -403,7 +411,7 @@ function EncryptedStream(pair) {
util.inherits(EncryptedStream, CryptoStream);
-EncryptedStream.prototype._pendingBytes = function() {
+EncryptedStream.prototype._internallyPendingBytes = function() {
if (this.pair._ssl) {
return this.pair._ssl.encPending();
} else {
@@ -539,24 +547,28 @@ SecurePair.prototype._cycle = function(depth) {
if (!this._cycleEncryptedPullLock) {
this._cycleEncryptedPullLock = true;
+ debug("encrypted._pull");
this.encrypted._pull();
this._cycleEncryptedPullLock = false;
}
if (!this._cycleCleartextPullLock) {
this._cycleCleartextPullLock = true;
+ debug("cleartext._pull");
this.cleartext._pull();
this._cycleCleartextPullLock = false;
}
if (!this._cycleCleartextPushLock) {
this._cycleCleartextPushLock = true;
+ debug("cleartext._push");
this.cleartext._push();
this._cycleCleartextPushLock = false;
}
if (!this._cycleEncryptedPushLock) {
this._cycleEncryptedPushLock = true;
+ debug("encrypted._push");
this.encrypted._push();
this._cycleEncryptedPushLock = false;
}
--
1.7.3.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment