From a14fdfd2937311e377fa5dc01b3270126e2b0d42 Mon Sep 17 00:00:00 2001 From: guzhihao4 Date: Mon, 8 May 2023 12:09:52 +0800 Subject: [PATCH] Fix signal stack release Uses sigaltstack to get current signal stack There is no need to record in pthread structure Issue: #I716J1 Signed-off-by: guzhihao4 Change-Id: I22298f9bf1f7a55a10002fba70f9e05ba6b14979 --- porting/linux/user/src/internal/pthread_impl.h | 3 --- porting/linux/user/src/thread/pthread_create.c | 15 +++++---------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/porting/linux/user/src/internal/pthread_impl.h b/porting/linux/user/src/internal/pthread_impl.h index 760d867e..dce1bbf9 100644 --- a/porting/linux/user/src/internal/pthread_impl.h +++ b/porting/linux/user/src/internal/pthread_impl.h @@ -74,9 +74,6 @@ struct pthread { volatile int killlock[1]; char *dlerror_buf; void *stdio_locks; -#ifdef RESERVE_SIGNAL_STACK - void *signal_stack; -#endif /* Part 3 -- the positions of these fields relative to * the end of the structure is external and internal ABI. */ diff --git a/porting/linux/user/src/thread/pthread_create.c b/porting/linux/user/src/thread/pthread_create.c index 450fe8cc..8b830245 100644 --- a/porting/linux/user/src/thread/pthread_create.c +++ b/porting/linux/user/src/thread/pthread_create.c @@ -61,7 +61,6 @@ void __pthread_reserve_signal_stack() sigaltstack(&signal_stack, NULL); pthread_t self = __pthread_self(); - self->signal_stack = stack; char name[ANON_STACK_NAME_SIZE]; snprintf(name, ANON_STACK_NAME_SIZE, "signal_stack:%d", __pthread_self()->tid); prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, signal_stack.ss_sp, signal_stack.ss_size, name); @@ -70,17 +69,13 @@ void __pthread_reserve_signal_stack() void __pthread_release_signal_stack() { - pthread_t self = __pthread_self(); - if (self->signal_stack == NULL) { - return; - } - - stack_t signal_stack; + stack_t signal_stack, old_stack; memset(&signal_stack, 0, sizeof(signal_stack)); signal_stack.ss_flags = SS_DISABLE; - sigaltstack(&signal_stack, NULL); - munmap(self->signal_stack, RESERVE_SIGNAL_STACK_SIZE); - self->signal_stack = NULL; + sigaltstack(&signal_stack, &old_stack); + if (old_stack.ss_flags != SS_DISABLE) { + munmap(old_stack.ss_sp, old_stack.ss_size); + } } weak_alias(__pthread_reserve_signal_stack, pthread_reserve_signal_stack); -- GitLab