net: don't throw on bytesWritten access
authorTrevor Norris <trev.norris@gmail.com>
Fri, 9 Oct 2015 22:51:42 +0000 (16:51 -0600)
committerJames M Snell <jasnell@gmail.com>
Mon, 12 Oct 2015 17:25:49 +0000 (10:25 -0700)
If bytesWritten is accessed before the object has been properly
constructed then return undefined.

Fixes: https://github.com/nodejs/node/issues/3298
PR-URL: https://github.com/nodejs/node/pull/3305
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
lib/net.js
test/parallel/test-net-access-byteswritten.js [new file with mode: 0644]

index 47422c3..a7a8eb1 100644 (file)
@@ -727,6 +727,9 @@ Socket.prototype.__defineGetter__('bytesWritten', function() {
       data = this._pendingData,
       encoding = this._pendingEncoding;
 
+  if (!state)
+    return undefined;
+
   state.getBuffer().forEach(function(el) {
     if (el.chunk instanceof Buffer)
       bytes += el.chunk.length;
diff --git a/test/parallel/test-net-access-byteswritten.js b/test/parallel/test-net-access-byteswritten.js
new file mode 100644 (file)
index 0000000..362d533
--- /dev/null
@@ -0,0 +1,16 @@
+'use strict';
+
+require('../common');
+const assert = require('assert');
+const net = require('net');
+const tls = require('tls');
+const tty = require('tty');
+
+// Check that the bytesWritten getter doesn't crash if object isn't
+// constructed.
+assert.strictEqual(net.Socket.prototype.bytesWritten, undefined);
+assert.strictEqual(tls.TLSSocket.super_.prototype.bytesWritten, undefined);
+assert.strictEqual(tls.TLSSocket.prototype.bytesWritten, undefined);
+assert.strictEqual(tty.ReadStream.super_.prototype.bytesWritten, undefined);
+assert.strictEqual(tty.ReadStream.prototype.bytesWritten, undefined);
+assert.strictEqual(tty.WriteStream.prototype.bytesWritten, undefined);