summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node.gyp6
-rw-r--r--test/parallel/test-stack-size-limit.js26
2 files changed, 32 insertions, 0 deletions
diff --git a/node.gyp b/node.gyp
index d063a64080..0f5e71da53 100644
--- a/node.gyp
+++ b/node.gyp
@@ -172,6 +172,12 @@
'RandomizedBaseAddress': 2, # enable ASLR
'DataExecutionPrevention': 2, # enable DEP
'AllowIsolation': 'true',
+ # By default, the MSVC linker only reserves 1 MiB of stack memory for
+ # each thread, whereas other platforms typically allow much larger
+ # stack memory sections. We raise the limit to make it more consistent
+ # across platforms and to support the few use cases that require large
+ # amounts of stack memory, without having to modify the node binary.
+ 'StackReserveSize': 0x800000,
},
},
diff --git a/test/parallel/test-stack-size-limit.js b/test/parallel/test-stack-size-limit.js
new file mode 100644
index 0000000000..f66fe8527c
--- /dev/null
+++ b/test/parallel/test-stack-size-limit.js
@@ -0,0 +1,26 @@
+'use strict';
+
+require('../common');
+
+const assert = require('assert');
+const { spawnSync } = require('child_process');
+
+// The default --stack-size is 984, which is below Windows' default stack size
+// limit of 1 MiB. However, even a slight increase would cause node to exceed
+// the 1 MiB limit and thus to crash with the exit code STATUS_STACK_OVERFLOW.
+// Newer versions of Node.js allow the stack size to grow to up to 8 MiB, which
+// better aligns with default limits on other platforms and which is commonly
+// used for browsers on Windows.
+// See https://github.com/nodejs/node/issues/43630.
+
+const { status, signal, stderr } = spawnSync(process.execPath, [
+ '--stack-size=2000',
+ '-e',
+ '(function explode() { return explode(); })()',
+], {
+ encoding: 'utf8'
+});
+
+assert.strictEqual(status, 1);
+assert.strictEqual(signal, null);
+assert.match(stderr, /Maximum call stack size exceeded/);