From d075c2aea8a748849e46e001c5865c69143a0db3 Mon Sep 17 00:00:00 2001 From: guzhihao4 Date: Tue, 16 May 2023 10:34:22 +0800 Subject: [PATCH] fixed e70e9ca from https://gitee.com/guzhihao4/third_party_musl/pulls/903 Fix memory leak in signal stack release Release signal stack guard separately Issue: #I73EUD Test: Libctest pass & mmap check noleak Signed-off-by: guzhihao4 Change-Id: Idca65a1c87898ab3cbb0e84e1c39f0772dad89cc --- porting/linux/user/src/internal/pthread_impl.h | 3 +++ porting/linux/user/src/thread/pthread_create.c | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/porting/linux/user/src/internal/pthread_impl.h b/porting/linux/user/src/internal/pthread_impl.h index dce1bbf9..760d867e 100644 --- a/porting/linux/user/src/internal/pthread_impl.h +++ b/porting/linux/user/src/internal/pthread_impl.h @@ -74,6 +74,9 @@ 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 8b830245..4525f795 100644 --- a/porting/linux/user/src/thread/pthread_create.c +++ b/porting/linux/user/src/thread/pthread_create.c @@ -61,6 +61,7 @@ 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); @@ -69,13 +70,20 @@ 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, old_stack; memset(&signal_stack, 0, sizeof(signal_stack)); signal_stack.ss_flags = SS_DISABLE; sigaltstack(&signal_stack, &old_stack); + munmap(self->signal_stack, __default_guardsize); if (old_stack.ss_flags != SS_DISABLE) { munmap(old_stack.ss_sp, old_stack.ss_size); } + self->signal_stack = NULL; } weak_alias(__pthread_reserve_signal_stack, pthread_reserve_signal_stack); -- GitLab