提交 d075c2ae 编写于 作者: G guzhihao4

fixed e70e9ca6 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: Nguzhihao4 <guzhihao4@huawei.com>
Change-Id: Idca65a1c87898ab3cbb0e84e1c39f0772dad89cc
上级 ca62bb3d
......@@ -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. */
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册