Skip to content

Commit

Permalink
src: reset signal handler to SIG_DFL on FreeBSD
Browse files Browse the repository at this point in the history
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: nodejs/node-v0.x-archive#9326
PR-URL: #1218
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
indutny committed Mar 20, 2015
1 parent 6fc5e95 commit b64983d
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/node.cc
Expand Up @@ -2877,6 +2877,13 @@ static void AtExit() {

static void SignalExit(int signo) {
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);
}

Expand Down Expand Up @@ -3257,7 +3264,12 @@ static void RegisterSignalHandler(int signal,
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
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;
#endif
sigfillset(&sa.sa_mask);
CHECK_EQ(sigaction(signal, &sa, nullptr), 0);
}
Expand Down
12 changes: 12 additions & 0 deletions test/parallel/test-regress-GH-node-9326.js
@@ -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);
});

0 comments on commit b64983d

Please sign in to comment.