From 9657ffc45951bc6b1a9c7298fc6dfb5a1f9e3808 Mon Sep 17 00:00:00 2001 From: Efe Karasakal Date: Tue, 14 Jul 2026 22:24:03 +0200 Subject: [PATCH 1/2] http: guard invalid timeout values in checkConnections Signed-off-by: Efe Karasakal --- lib/_http_server.js | 11 +++++-- ...server-invalid-headers-timeout-no-abort.js | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-http-server-invalid-headers-timeout-no-abort.js diff --git a/lib/_http_server.js b/lib/_http_server.js index 0f5865126689..dd127f5ed3ef 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -739,11 +739,18 @@ assignFunctionName(EE.captureRejectionSymbol, function(err, event, ...args) { }); function checkConnections() { - if (this.headersTimeout === 0 && this.requestTimeout === 0) { + const headersTimeout = + NumberIsFinite(this.headersTimeout) && this.headersTimeout >= 0 ? + this.headersTimeout : 0; + const requestTimeout = + NumberIsFinite(this.requestTimeout) && this.requestTimeout >= 0 ? + this.requestTimeout : 0; + + if (headersTimeout === 0 && requestTimeout === 0) { return; } - const expired = this[kConnections].expired(this.headersTimeout, this.requestTimeout); + const expired = this[kConnections].expired(headersTimeout, requestTimeout); for (let i = 0; i < expired.length; i++) { const socket = expired[i].socket; diff --git a/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js new file mode 100644 index 000000000000..85c6b95c56a1 --- /dev/null +++ b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js @@ -0,0 +1,33 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const { spawnSync } = require('child_process'); + +if (process.argv[2] === 'child') { + const { createServer } = require('http'); + + const server = createServer({ + connectionsCheckingInterval: 1, + }, (_req, res) => { + res.end('ok'); + }); + + server.headersTimeout = 'im-not-a-number'; + + server.listen(0, '127.0.0.1', () => { + setTimeout(() => { + server.close(() => process.exit(0)); + }, 50); + }); +} else { + // Run the repro in a child so the native crash is observable without failing the whole run + const { signal, status, stderr } = spawnSync( + process.execPath, + [__filename, 'child'], + { encoding: 'utf8' }, + ); + + assert.strictEqual(signal, null); + assert.strictEqual(status, 0, stderr); +} From 13f9c804416b0659e9855674626736ab62b8fc28 Mon Sep 17 00:00:00 2001 From: Efe Karasakal Date: Sat, 25 Jul 2026 10:30:04 +0200 Subject: [PATCH 2/2] http: update tests Signed-off-by: Efe Karasakal --- ...server-invalid-headers-timeout-no-abort.js | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js index 85c6b95c56a1..fc0a7041be93 100644 --- a/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js +++ b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js @@ -1,33 +1,19 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); -const { spawnSync } = require('child_process'); +const { createServer } = require('http'); -if (process.argv[2] === 'child') { - const { createServer } = require('http'); +const server = createServer({ + connectionsCheckingInterval: 1, +}, common.mustNotCall()); - const server = createServer({ - connectionsCheckingInterval: 1, - }, (_req, res) => { - res.end('ok'); - }); +// Invalid headersTimeout should not crash the server +server.headersTimeout = 'im-not-a-number'; +assert.strictEqual(server.headersTimeout, 'im-not-a-number'); - server.headersTimeout = 'im-not-a-number'; - - server.listen(0, '127.0.0.1', () => { - setTimeout(() => { - server.close(() => process.exit(0)); - }, 50); - }); -} else { - // Run the repro in a child so the native crash is observable without failing the whole run - const { signal, status, stderr } = spawnSync( - process.execPath, - [__filename, 'child'], - { encoding: 'utf8' }, - ); - - assert.strictEqual(signal, null); - assert.strictEqual(status, 0, stderr); -} +server.listen(0, '127.0.0.1', common.mustCall(() => { + setTimeout(common.mustCall(() => { + server.close(common.mustCall()); + }), common.platformTimeout(50)); +}));