8141529: Fix handling of _JAVA_SR_SIGNUM

Reviewed-by: dholmes, stuefe, dsamersoff
This commit is contained in:
Goetz Lindenmaier 2015-11-05 15:05:59 +01:00
parent 3904de571b
commit 0a4657e8c1
10 changed files with 97 additions and 98 deletions

View file

@ -2769,8 +2769,12 @@ static int SR_initialize() {
// Get signal number to use for suspend/resume
if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
int sig = ::strtol(s, 0, 10);
if (sig > 0 || sig < NSIG) {
if (sig > MAX2(SIGSEGV, SIGBUS) && // See 4355769.
sig < NSIG) { // Must be legal signal and fit into sigflags[].
SR_signum = sig;
} else {
warning("You set _JAVA_SR_SIGNUM=%d. It must be in range [%d, %d]. Using %d instead.",
sig, MAX2(SIGSEGV, SIGBUS)+1, NSIG-1, SR_signum);
}
}
@ -2966,8 +2970,8 @@ void javaSignalHandler(int sig, siginfo_t* info, void* uc) {
bool os::Aix::signal_handlers_are_installed = false;
// For signal-chaining
struct sigaction os::Aix::sigact[MAXSIGNUM];
unsigned int os::Aix::sigs = 0;
struct sigaction sigact[NSIG];
sigset_t sigs;
bool os::Aix::libjsig_is_loaded = false;
typedef struct sigaction *(*get_signal_t)(int);
get_signal_t os::Aix::get_signal_action = NULL;
@ -3045,29 +3049,31 @@ bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) {
}
struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
if ((((unsigned int)1 << sig) & sigs) != 0) {
if (sigismember(&sigs, sig)) {
return &sigact[sig];
}
return NULL;
}
void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
sigact[sig] = oldAct;
sigs |= (unsigned int)1 << sig;
sigaddset(&sigs, sig);
}
// for diagnostic
int os::Aix::sigflags[MAXSIGNUM];
int sigflags[NSIG];
int os::Aix::get_our_sigflags(int sig) {
assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
return sigflags[sig];
}
void os::Aix::set_our_sigflags(int sig, int flags) {
assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
sigflags[sig] = flags;
assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
if (sig > 0 && sig < NSIG) {
sigflags[sig] = flags;
}
}
void os::Aix::set_signal_handler(int sig, bool set_installed) {
@ -3107,7 +3113,7 @@ void os::Aix::set_signal_handler(int sig, bool set_installed) {
sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
}
// Save flags, which are set by ours
assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
sigflags[sig] = sigAct.sa_flags;
int ret = sigaction(sig, &sigAct, &oldAct);
@ -3140,10 +3146,11 @@ void os::Aix::install_signal_handlers() {
assert(UseSignalChaining, "should enable signal-chaining");
}
if (libjsig_is_loaded) {
// Tell libjsig jvm is setting signal handlers
// Tell libjsig jvm is setting signal handlers.
(*begin_signal_setting)();
}
::sigemptyset(&sigs);
set_signal_handler(SIGSEGV, true);
set_signal_handler(SIGPIPE, true);
set_signal_handler(SIGBUS, true);