summaryrefslogtreecommitdiff
path: root/test/parallel/test-fs-write-sigxfsz.js
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2019-05-23 11:27:53 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2019-05-23 11:28:07 +0200
commit58fe440c0f62865caf1fbb5b668f0413afbd1c9c (patch)
tree61cafd79eed9fa3f9e38b453519ecef73f2eb1ab /test/parallel/test-fs-write-sigxfsz.js
parentca8e33aef9c39f52601c20b69ea365abcfe8ae81 (diff)
downloadandroid-node-v8-58fe440c0f62865caf1fbb5b668f0413afbd1c9c.tar.gz
android-node-v8-58fe440c0f62865caf1fbb5b668f0413afbd1c9c.tar.bz2
android-node-v8-58fe440c0f62865caf1fbb5b668f0413afbd1c9c.zip
src: ignore SIGXFSZ, don't terminate (ulimit -f)
Ignore SIGXFSZ signals so that exceeding RLIMIT_FSIZE makes the offending system call fail with EFBIG instead of terminating the process. PR-URL: https://github.com/nodejs/node/pull/27798 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'test/parallel/test-fs-write-sigxfsz.js')
-rw-r--r--test/parallel/test-fs-write-sigxfsz.js32
1 files changed, 32 insertions, 0 deletions
diff --git a/test/parallel/test-fs-write-sigxfsz.js b/test/parallel/test-fs-write-sigxfsz.js
new file mode 100644
index 0000000000..323312fcb9
--- /dev/null
+++ b/test/parallel/test-fs-write-sigxfsz.js
@@ -0,0 +1,32 @@
+// Check that exceeding RLIMIT_FSIZE fails with EFBIG
+// rather than terminating the process with SIGXFSZ.
+'use strict';
+const common = require('../common');
+const tmpdir = require('../common/tmpdir');
+
+const assert = require('assert');
+const child_process = require('child_process');
+const fs = require('fs');
+const path = require('path');
+
+if (common.isWindows)
+ common.skip('no RLIMIT_FSIZE on Windows');
+
+if (process.config.variables.node_shared)
+ common.skip('SIGXFSZ signal handler not installed in shared library mode');
+
+if (process.argv[2] === 'child') {
+ const filename = path.join(tmpdir.path, 'efbig.txt');
+ tmpdir.refresh();
+ fs.writeFileSync(filename, '.'.repeat(1 << 16)); // Exceeds RLIMIT_FSIZE.
+} else {
+ const cmd = `ulimit -f 1 && '${process.execPath}' '${__filename}' child`;
+ const result = child_process.spawnSync('/bin/sh', ['-c', cmd]);
+ const haystack = result.stderr.toString();
+ const needle = 'Error: EFBIG: file too large, write';
+ const ok = haystack.includes(needle);
+ if (!ok) console.error(haystack);
+ assert(ok);
+ assert.strictEqual(result.status, 1);
+ assert.strictEqual(result.stdout.toString(), '');
+}