[test] SIGSTKSZ is not constant in glibc>2.34
This commit is contained in:
parent
b93b8412dc
commit
95eac28425
@ -269,13 +269,17 @@ static void handle_sigfpe(int num, siginfo_t *info, void *_context) {
|
||||
}
|
||||
|
||||
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 = {
|
||||
.ss_size = SIGSTKSZ * 4,
|
||||
.ss_sp = stack,
|
||||
.ss_flags = 0,
|
||||
};
|
||||
if (sigaltstack(&expected_ss, NULL) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("failed to call sigaltstack");
|
||||
}
|
||||
|
||||
@ -286,9 +290,11 @@ int test_handle_sigfpe() {
|
||||
new_action.sa_sigaction = handle_sigfpe;
|
||||
new_action.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
|
||||
if (sigaction(SIGFPE, &new_action, &old_action) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("registering new signal handler failed");
|
||||
}
|
||||
if (old_action.sa_handler != SIG_DFL) {
|
||||
free(stack);
|
||||
THROW_ERROR("unexpected old sig handler");
|
||||
}
|
||||
|
||||
@ -305,14 +311,17 @@ int test_handle_sigfpe() {
|
||||
fxsave(y);
|
||||
|
||||
if (memcmp(x, y, 512) != 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("floating point registers are modified");
|
||||
}
|
||||
|
||||
printf("Signal handler successfully jumped over the divide-by-zero instruction\n");
|
||||
|
||||
if (sigaction(SIGFPE, &old_action, NULL) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("restoring old signal handler failed");
|
||||
}
|
||||
free(stack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -388,22 +397,28 @@ static void handle_sigpipe(int num, siginfo_t *info, void *context) {
|
||||
}
|
||||
|
||||
int test_sigaltstack() {
|
||||
static char stack[SIGSTKSZ];
|
||||
char *stack = malloc(SIGSTKSZ);
|
||||
if (stack == NULL) {
|
||||
THROW_ERROR("stack allocation failed");
|
||||
}
|
||||
stack_t expected_ss = {
|
||||
.ss_size = SIGSTKSZ,
|
||||
.ss_sp = stack,
|
||||
.ss_flags = 0,
|
||||
};
|
||||
if (sigaltstack(&expected_ss, NULL) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("failed to call sigaltstack");
|
||||
}
|
||||
stack_t actual_ss;
|
||||
if (sigaltstack(NULL, &actual_ss) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("failed to call sigaltstack");
|
||||
}
|
||||
if (actual_ss.ss_size != expected_ss.ss_size
|
||||
|| actual_ss.ss_sp != expected_ss.ss_sp
|
||||
|| actual_ss.ss_flags != expected_ss.ss_flags) {
|
||||
free(stack);
|
||||
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_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
|
||||
if (sigaction(SIGPIPE, &new_action, &old_action) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("registering new signal handler failed");
|
||||
}
|
||||
if (old_action.sa_handler != SIG_DFL) {
|
||||
free(stack);
|
||||
THROW_ERROR("unexpected old sig handler");
|
||||
}
|
||||
|
||||
raise(SIGPIPE);
|
||||
if (g_old_ss.ss_flags != SS_ONSTACK) {
|
||||
free(stack);
|
||||
THROW_ERROR("check stack flags failed");
|
||||
}
|
||||
|
||||
if (sigaction(SIGPIPE, &old_action, NULL) < 0) {
|
||||
free(stack);
|
||||
THROW_ERROR("restoring old signal handler failed");
|
||||
}
|
||||
free(stack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user