From f304f915b251216c8d6d26a94e6508a3101a2ac8 Mon Sep 17 00:00:00 2001 From: Xavier Stouder Date: Sat, 13 Dec 2025 02:10:45 +0100 Subject: [PATCH 1/4] os: freeze signals constant Remove the ability to mutate signals constant as doing so can lead to unexpected behavior, notably when spawning child process. Fixes: https://github.com/nodejs/node/issues/44749 --- lib/os.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/os.js b/lib/os.js index 9f062fea04d9ea..6305c701243e78 100644 --- a/lib/os.js +++ b/lib/os.js @@ -27,6 +27,7 @@ const { ObjectDefineProperties, StringPrototypeSlice, SymbolToPrimitive, + ObjectFreeze, } = primordials; const { getTempDir } = internalBinding('credentials'); @@ -330,6 +331,8 @@ module.exports = { machine: getMachine, }; +ObjectFreeze(constants.signals); + ObjectDefineProperties(module.exports, { constants: { __proto__: null, From c66f71d92de50b3f61c2f8da29c9fe69ea8df3fc Mon Sep 17 00:00:00 2001 From: Xavier Stouder Date: Sat, 13 Dec 2025 02:25:22 +0100 Subject: [PATCH 2/4] os: add test for signals constant immutability --- test/parallel/test-os-constants-signals.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/parallel/test-os-constants-signals.js diff --git a/test/parallel/test-os-constants-signals.js b/test/parallel/test-os-constants-signals.js new file mode 100644 index 00000000000000..0efc413ca28584 --- /dev/null +++ b/test/parallel/test-os-constants-signals.js @@ -0,0 +1,12 @@ +'use strict'; + +const common = require('../common'); +const { test } = require('node:test'); +const assert = require('node:assert'); +const { constants } = require('node:os'); + +const { internalBinding } = require('internal/test/binding'); + +test('Verify that signals constant is immutable', () => { + assert.throws(() => constants.signals.FOOBAR = 1337, TypeError); +}) \ No newline at end of file From 4b1a36ca7992fcce371b42662c80d09419536249 Mon Sep 17 00:00:00 2001 From: Xavier Stouder Date: Sat, 13 Dec 2025 02:35:07 +0100 Subject: [PATCH 3/4] os: run linter on test too --- test/parallel/test-os-constants-signals.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/parallel/test-os-constants-signals.js b/test/parallel/test-os-constants-signals.js index 0efc413ca28584..5e6daf19019392 100644 --- a/test/parallel/test-os-constants-signals.js +++ b/test/parallel/test-os-constants-signals.js @@ -1,12 +1,10 @@ 'use strict'; -const common = require('../common'); const { test } = require('node:test'); const assert = require('node:assert'); const { constants } = require('node:os'); -const { internalBinding } = require('internal/test/binding'); test('Verify that signals constant is immutable', () => { - assert.throws(() => constants.signals.FOOBAR = 1337, TypeError); -}) \ No newline at end of file + assert.throws(() => constants.signals.FOOBAR = 1337, TypeError); +}); From 55ff2a1b72cad6a00449ab59517a1be6ca488478 Mon Sep 17 00:00:00 2001 From: Xavier Stouder Date: Sat, 13 Dec 2025 02:42:30 +0100 Subject: [PATCH 4/4] fix ci --- lib/os.js | 2 +- test/parallel/test-os-constants-signals.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/os.js b/lib/os.js index 6305c701243e78..5e53879bd6d5aa 100644 --- a/lib/os.js +++ b/lib/os.js @@ -25,9 +25,9 @@ const { ArrayPrototypePush, Float64Array, ObjectDefineProperties, + ObjectFreeze, StringPrototypeSlice, SymbolToPrimitive, - ObjectFreeze, } = primordials; const { getTempDir } = internalBinding('credentials'); diff --git a/test/parallel/test-os-constants-signals.js b/test/parallel/test-os-constants-signals.js index 5e6daf19019392..a4fac1b63566fa 100644 --- a/test/parallel/test-os-constants-signals.js +++ b/test/parallel/test-os-constants-signals.js @@ -1,5 +1,6 @@ 'use strict'; +require('../common'); const { test } = require('node:test'); const assert = require('node:assert'); const { constants } = require('node:os');