@@ -768,6 +768,17 @@ static void set_our_sigflags(int sig, int flags) {
768
768
}
769
769
}
770
770
771
+ // Implementation may use the same storage for both the sa_sigaction field and the sa_handler field,
772
+ // so check for "sigAct.sa_flags == SA_SIGINFO"
773
+ static address get_signal_handler (const struct sigaction * action) {
774
+ bool siginfo_flag_set = (action->sa_flags & SA_SIGINFO) != 0 ;
775
+ if (siginfo_flag_set) {
776
+ return CAST_FROM_FN_PTR (address, action->sa_sigaction );
777
+ } else {
778
+ return CAST_FROM_FN_PTR (address, action->sa_handler );
779
+ }
780
+ }
781
+
771
782
typedef int (*os_sigaction_t )(int , const struct sigaction *, struct sigaction *);
772
783
773
784
static void SR_handler (int sig, siginfo_t * siginfo, ucontext_t * context);
@@ -789,10 +800,7 @@ static void check_signal_handler(int sig) {
789
800
// See comment for SA_RESTORER_FLAG_MASK
790
801
LINUX_ONLY (act.sa_flags &= SA_RESTORER_FLAG_MASK;)
791
802
792
- address thisHandler = (act.sa_flags & SA_SIGINFO)
793
- ? CAST_FROM_FN_PTR (address, act.sa_sigaction )
794
- : CAST_FROM_FN_PTR (address, act.sa_handler );
795
-
803
+ address thisHandler = get_signal_handler (&act);
796
804
797
805
switch (sig) {
798
806
case SIGSEGV:
@@ -1213,9 +1221,7 @@ void set_signal_handler(int sig) {
1213
1221
struct sigaction oldAct;
1214
1222
sigaction (sig, (struct sigaction *)NULL , &oldAct);
1215
1223
1216
- void * oldhand = oldAct.sa_sigaction
1217
- ? CAST_FROM_FN_PTR (void *, oldAct.sa_sigaction )
1218
- : CAST_FROM_FN_PTR (void *, oldAct.sa_handler );
1224
+ void * oldhand = get_signal_handler (&oldAct);
1219
1225
if (oldhand != CAST_FROM_FN_PTR (void *, SIG_DFL) &&
1220
1226
oldhand != CAST_FROM_FN_PTR (void *, SIG_IGN) &&
1221
1227
oldhand != CAST_FROM_FN_PTR (void *, (sa_sigaction_t )javaSignalHandler)) {
@@ -1258,9 +1264,7 @@ void set_signal_handler(int sig) {
1258
1264
int ret = sigaction (sig, &sigAct, &oldAct);
1259
1265
assert (ret == 0 , " check" );
1260
1266
1261
- void * oldhand2 = oldAct.sa_sigaction
1262
- ? CAST_FROM_FN_PTR (void *, oldAct.sa_sigaction )
1263
- : CAST_FROM_FN_PTR (void *, oldAct.sa_handler );
1267
+ void * oldhand2 = get_signal_handler (&oldAct);
1264
1268
assert (oldhand2 == oldhand, " no concurrent signal handler installation" );
1265
1269
}
1266
1270
@@ -1370,9 +1374,7 @@ void PosixSignals::print_signal_handler(outputStream* st, int sig,
1370
1374
1371
1375
st->print (" %s: " , os::exception_name (sig, buf, buflen));
1372
1376
1373
- address handler = (sa.sa_flags & SA_SIGINFO)
1374
- ? CAST_FROM_FN_PTR (address, sa.sa_sigaction )
1375
- : CAST_FROM_FN_PTR (address, sa.sa_handler );
1377
+ address handler = get_signal_handler (&sa);
1376
1378
1377
1379
if (handler == CAST_FROM_FN_PTR (address, SIG_DFL)) {
1378
1380
st->print (" SIG_DFL" );
@@ -1437,8 +1439,7 @@ void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1437
1439
bool PosixSignals::is_sig_ignored (int sig) {
1438
1440
struct sigaction oact;
1439
1441
sigaction (sig, (struct sigaction *)NULL , &oact);
1440
- void * ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR (void *, oact.sa_sigaction )
1441
- : CAST_FROM_FN_PTR (void *, oact.sa_handler );
1442
+ void * ohlr = get_signal_handler (&oact);
1442
1443
if (ohlr == CAST_FROM_FN_PTR (void *, SIG_IGN)) {
1443
1444
return true ;
1444
1445
} else {
0 commit comments