diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2019-05-23 11:27:53 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2019-05-23 11:28:07 +0200 |
commit | 58fe440c0f62865caf1fbb5b668f0413afbd1c9c (patch) | |
tree | 61cafd79eed9fa3f9e38b453519ecef73f2eb1ab /test/parallel/test-fs-write-sigxfsz.js | |
parent | ca8e33aef9c39f52601c20b69ea365abcfe8ae81 (diff) | |
download | android-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.js | 32 |
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(), ''); +} |