src: reset signal handler to SIG_DFL on FreeBSD
FreeBSD has a nasty bug with SA_RESETHAND reseting the SA_SIGINFO, that is in turn set for a libthr wrapper. This leads to a crash. Work around the issue by manually setting SIG_DFL in the signal handler. Fix: https://github.com/joyent/node/issues/9326 PR-URL: https://github.com/iojs/io.js/pull/1218 Reviewed-By: Johan Bergström <bugs@bergstroem.nu> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
6fc5e95354
commit
b64983d77c
12
src/node.cc
12
src/node.cc
@ -2877,6 +2877,13 @@ static void AtExit() {
|
|||||||
|
|
||||||
static void SignalExit(int signo) {
|
static void SignalExit(int signo) {
|
||||||
uv_tty_reset_mode();
|
uv_tty_reset_mode();
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
// FreeBSD has a nasty bug, see RegisterSignalHandler for details
|
||||||
|
struct sigaction sa;
|
||||||
|
memset(&sa, 0, sizeof(sa));
|
||||||
|
sa.sa_handler = SIG_DFL;
|
||||||
|
CHECK_EQ(sigaction(signo, &sa, nullptr), 0);
|
||||||
|
#endif
|
||||||
raise(signo);
|
raise(signo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3257,7 +3264,12 @@ static void RegisterSignalHandler(int signal,
|
|||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
memset(&sa, 0, sizeof(sa));
|
memset(&sa, 0, sizeof(sa));
|
||||||
sa.sa_handler = handler;
|
sa.sa_handler = handler;
|
||||||
|
#ifndef __FreeBSD__
|
||||||
|
// FreeBSD has a nasty bug with SA_RESETHAND reseting the SA_SIGINFO, that is
|
||||||
|
// in turn set for a libthr wrapper. This leads to a crash.
|
||||||
|
// Work around the issue by manually setting SIG_DFL in the signal handler
|
||||||
sa.sa_flags = reset_handler ? SA_RESETHAND : 0;
|
sa.sa_flags = reset_handler ? SA_RESETHAND : 0;
|
||||||
|
#endif
|
||||||
sigfillset(&sa.sa_mask);
|
sigfillset(&sa.sa_mask);
|
||||||
CHECK_EQ(sigaction(signal, &sa, nullptr), 0);
|
CHECK_EQ(sigaction(signal, &sa, nullptr), 0);
|
||||||
}
|
}
|
||||||
|
12
test/parallel/test-regress-GH-node-9326.js
Normal file
12
test/parallel/test-regress-GH-node-9326.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var child_process = require('child_process');
|
||||||
|
|
||||||
|
// NOTE: Was crashing on FreeBSD
|
||||||
|
var cp = child_process.spawn(process.execPath, [
|
||||||
|
'-e',
|
||||||
|
'process.kill(process.pid, "SIGINT")'
|
||||||
|
]);
|
||||||
|
|
||||||
|
cp.on('exit', function(code) {
|
||||||
|
assert.notEqual(code, 0);
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user