diff --git a/lib/internal/process.js b/lib/internal/process.js index 8afb89dccac84b..bd088394095918 100644 --- a/lib/internal/process.js +++ b/lib/internal/process.js @@ -191,6 +191,14 @@ function setupSignalHandlers() { process.on('newListener', function(type, listener) { if (isSignal(type) && !signalWraps.hasOwnProperty(type)) { + + if (['SIGBUS', 'SIGFPE', 'SIGSEGV', 'SIGILL'].indexOf(type) > -1) { + process.emitWarning( + 'Listening to SIGBUS, SIGFPE, SIGSEGV, SIGILL signals ' + + 'is not safe and the listener may be called in an ' + + 'infinite loop'); + } + const Signal = process.binding('signal_wrap').Signal; const wrap = new Signal(); diff --git a/test/parallel/test-process-safe-signals.js b/test/parallel/test-process-safe-signals.js new file mode 100644 index 00000000000000..a2aed48a9dd256 --- /dev/null +++ b/test/parallel/test-process-safe-signals.js @@ -0,0 +1,5 @@ +'use strict'; +const common = require('../common'); + +process.on('warning', common.fail); +process.on('SIGINT', () => {}); diff --git a/test/parallel/test-process-unsafe-signals.js b/test/parallel/test-process-unsafe-signals.js new file mode 100644 index 00000000000000..dea2dd191c42a0 --- /dev/null +++ b/test/parallel/test-process-unsafe-signals.js @@ -0,0 +1,13 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +process.on('warning', common.mustCall((warning) => { + assert.strictEqual(warning.name, 'Warning'); + assert.strictEqual(warning.message, + 'Listening to SIGBUS, SIGFPE, SIGSEGV, SIGILL signals ' + + 'is not safe and the listener may be called in an ' + + 'infinite loop'); +})); + +process.on('SIGBUS', () => {});