Skip to content

Commit

Permalink
net: emit "write after end" errors in the next tick
Browse files Browse the repository at this point in the history
This commit makes those errors caused by calling
`net.Socket.write()` after sockets ending be emitted in the next
tick.

PR-URL: #24457
Fixes: #24111
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
oyyd authored and Trott committed Nov 25, 2018
1 parent 8c0aa84 commit 9389b46
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
3 changes: 1 addition & 2 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,7 @@ function writeAfterFIN(chunk, encoding, cb) {
// eslint-disable-next-line no-restricted-syntax
var er = new Error('This socket has been ended by the other party');
er.code = 'EPIPE';
// TODO: defer error events consistently everywhere, not just the cb
this.emit('error', er);
process.nextTick(emitErrorNT, this, er);
if (typeof cb === 'function') {
defaultTriggerAsyncIdScope(this[async_id_symbol], process.nextTick, cb, er);
}
Expand Down
26 changes: 26 additions & 0 deletions test/parallel/test-net-write-after-end-nt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
'use strict';
const common = require('../common');

const assert = require('assert');
const net = require('net');

const { mustCall } = common;

// This test ensures those errors caused by calling `net.Socket.write()`
// after sockets ending will be emitted in the next tick.
const server = net.createServer(mustCall((socket) => {
socket.end();
})).listen(() => {
const client = net.connect(server.address().port, () => {
let hasError = false;
client.on('error', mustCall((err) => {
hasError = true;
server.close();
}));
client.on('end', mustCall(() => {
client.write('hello', mustCall());
assert(!hasError, 'The error should be emitted in the next tick.');
}));
client.end();
});
});

0 comments on commit 9389b46

Please sign in to comment.