[test] SIGSTKSZ is not constant in glibc>2.34

This commit is contained in:
Qi Zheng 2023-11-21 09:18:11 +08:00 committed by volcano
parent b93b8412dc
commit 95eac28425

@ -269,13 +269,17 @@ static void handle_sigfpe(int num, siginfo_t *info, void *_context) {
} }
int test_handle_sigfpe() { int test_handle_sigfpe() {
static char stack[SIGSTKSZ * 4]; char *stack = malloc(SIGSTKSZ * 4);
if (stack == NULL) {
THROW_ERROR("stack allocation failed");
}
stack_t expected_ss = { stack_t expected_ss = {
.ss_size = SIGSTKSZ * 4, .ss_size = SIGSTKSZ * 4,
.ss_sp = stack, .ss_sp = stack,
.ss_flags = 0, .ss_flags = 0,
}; };
if (sigaltstack(&expected_ss, NULL) < 0) { if (sigaltstack(&expected_ss, NULL) < 0) {
free(stack);
THROW_ERROR("failed to call sigaltstack"); THROW_ERROR("failed to call sigaltstack");
} }
@ -286,9 +290,11 @@ int test_handle_sigfpe() {
new_action.sa_sigaction = handle_sigfpe; new_action.sa_sigaction = handle_sigfpe;
new_action.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK; new_action.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
if (sigaction(SIGFPE, &new_action, &old_action) < 0) { if (sigaction(SIGFPE, &new_action, &old_action) < 0) {
free(stack);
THROW_ERROR("registering new signal handler failed"); THROW_ERROR("registering new signal handler failed");
} }
if (old_action.sa_handler != SIG_DFL) { if (old_action.sa_handler != SIG_DFL) {
free(stack);
THROW_ERROR("unexpected old sig handler"); THROW_ERROR("unexpected old sig handler");
} }
@ -305,14 +311,17 @@ int test_handle_sigfpe() {
fxsave(y); fxsave(y);
if (memcmp(x, y, 512) != 0) { if (memcmp(x, y, 512) != 0) {
free(stack);
THROW_ERROR("floating point registers are modified"); THROW_ERROR("floating point registers are modified");
} }
printf("Signal handler successfully jumped over the divide-by-zero instruction\n"); printf("Signal handler successfully jumped over the divide-by-zero instruction\n");
if (sigaction(SIGFPE, &old_action, NULL) < 0) { if (sigaction(SIGFPE, &old_action, NULL) < 0) {
free(stack);
THROW_ERROR("restoring old signal handler failed"); THROW_ERROR("restoring old signal handler failed");
} }
free(stack);
return 0; return 0;
} }
@ -388,22 +397,28 @@ static void handle_sigpipe(int num, siginfo_t *info, void *context) {
} }
int test_sigaltstack() { int test_sigaltstack() {
static char stack[SIGSTKSZ]; char *stack = malloc(SIGSTKSZ);
if (stack == NULL) {
THROW_ERROR("stack allocation failed");
}
stack_t expected_ss = { stack_t expected_ss = {
.ss_size = SIGSTKSZ, .ss_size = SIGSTKSZ,
.ss_sp = stack, .ss_sp = stack,
.ss_flags = 0, .ss_flags = 0,
}; };
if (sigaltstack(&expected_ss, NULL) < 0) { if (sigaltstack(&expected_ss, NULL) < 0) {
free(stack);
THROW_ERROR("failed to call sigaltstack"); THROW_ERROR("failed to call sigaltstack");
} }
stack_t actual_ss; stack_t actual_ss;
if (sigaltstack(NULL, &actual_ss) < 0) { if (sigaltstack(NULL, &actual_ss) < 0) {
free(stack);
THROW_ERROR("failed to call sigaltstack"); THROW_ERROR("failed to call sigaltstack");
} }
if (actual_ss.ss_size != expected_ss.ss_size if (actual_ss.ss_size != expected_ss.ss_size
|| actual_ss.ss_sp != expected_ss.ss_sp || actual_ss.ss_sp != expected_ss.ss_sp
|| actual_ss.ss_flags != expected_ss.ss_flags) { || actual_ss.ss_flags != expected_ss.ss_flags) {
free(stack);
THROW_ERROR("failed to check the signal stack after set"); THROW_ERROR("failed to check the signal stack after set");
} }
@ -413,20 +428,25 @@ int test_sigaltstack() {
new_action.sa_sigaction = handle_sigpipe; new_action.sa_sigaction = handle_sigpipe;
new_action.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK; new_action.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
if (sigaction(SIGPIPE, &new_action, &old_action) < 0) { if (sigaction(SIGPIPE, &new_action, &old_action) < 0) {
free(stack);
THROW_ERROR("registering new signal handler failed"); THROW_ERROR("registering new signal handler failed");
} }
if (old_action.sa_handler != SIG_DFL) { if (old_action.sa_handler != SIG_DFL) {
free(stack);
THROW_ERROR("unexpected old sig handler"); THROW_ERROR("unexpected old sig handler");
} }
raise(SIGPIPE); raise(SIGPIPE);
if (g_old_ss.ss_flags != SS_ONSTACK) { if (g_old_ss.ss_flags != SS_ONSTACK) {
free(stack);
THROW_ERROR("check stack flags failed"); THROW_ERROR("check stack flags failed");
} }
if (sigaction(SIGPIPE, &old_action, NULL) < 0) { if (sigaction(SIGPIPE, &old_action, NULL) < 0) {
free(stack);
THROW_ERROR("restoring old signal handler failed"); THROW_ERROR("restoring old signal handler failed");
} }
free(stack);
return 0; return 0;
} }