Skip to content

Commit 4cdc5ea

Browse files
ronagdanielleadams
authored andcommittedFeb 16, 2021
http: fix ClientRequest unhandled errors
ClientRequest could someone cause an unhandled error from socket. Fixes: #36931 PR-URL: #36970 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent b87c0d6 commit 4cdc5ea

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed
 

‎lib/_http_client.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -818,13 +818,15 @@ function onSocketNT(req, socket, err) {
818818
req.emit('close');
819819
}
820820

821-
if (!err && req.agent) {
822-
socket?.emit('free');
823-
} else if (socket) {
824-
finished(socket.destroy(err || req[kError]), (er) => {
825-
_destroy(req, er || err);
826-
});
827-
return;
821+
if (socket) {
822+
if (!err && req.agent && !socket.destroyed) {
823+
socket.emit('free');
824+
} else {
825+
finished(socket.destroy(err || req[kError]), (er) => {
826+
_destroy(req, er || err);
827+
});
828+
return;
829+
}
828830
}
829831

830832
_destroy(req, err || req[kError]);
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const http = require('http');
5+
const net = require('net');
6+
7+
function createConnection() {
8+
const socket = new net.Socket();
9+
10+
process.nextTick(function() {
11+
socket.destroy(new Error('Oops'));
12+
});
13+
14+
return socket;
15+
}
16+
17+
{
18+
const req = http.get({ createConnection });
19+
20+
req.on('error', common.expectsError({ name: 'Error', message: 'Oops' }));
21+
req.abort();
22+
}
23+
24+
{
25+
class CustomAgent extends http.Agent {}
26+
CustomAgent.prototype.createConnection = createConnection;
27+
28+
const req = http.get({ agent: new CustomAgent() });
29+
30+
req.on('error', common.expectsError({ name: 'Error', message: 'Oops' }));
31+
req.abort();
32+
}

0 commit comments

Comments
 (0)