diff options
author | Yabin Cui <yabinc@google.com> | 2014-12-18 14:22:09 -0800 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-01-15 10:45:25 -0800 |
commit | 19e246dda6772ffc532b1762cd7870d6c3b01c12 (patch) | |
tree | 93ab36fe44bc75b7366ad6d362ba25bc4ba4d994 /libc/bionic/pthread_exit.cpp | |
parent | deab11acd7000573ad9c034e5bf9475aadbc5cbe (diff) | |
download | bionic-19e246dda6772ffc532b1762cd7870d6c3b01c12.zip bionic-19e246dda6772ffc532b1762cd7870d6c3b01c12.tar.gz bionic-19e246dda6772ffc532b1762cd7870d6c3b01c12.tar.bz2 |
Fix possible leak in pthread_detach.
If pthread_detach() is called while the thread is in pthread_exit(),
it takes the risk that no one can free the pthread_internal_t.
So I add PTHREAD_ATTR_FLAG_ZOMBIE to detect this, maybe very rare, but
both glibc and netbsd libpthread have similar function.
Change-Id: Iaa15f651903b8ca07aaa7bd4de46ff14a2f93835
Diffstat (limited to 'libc/bionic/pthread_exit.cpp')
-rw-r--r-- | libc/bionic/pthread_exit.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/libc/bionic/pthread_exit.cpp b/libc/bionic/pthread_exit.cpp index 9603a79..d0d64b0 100644 --- a/libc/bionic/pthread_exit.cpp +++ b/libc/bionic/pthread_exit.cpp @@ -99,6 +99,9 @@ void pthread_exit(void* return_value) { // pthread_internal_t is freed below with stack, not here. _pthread_internal_remove_locked(thread, false); free_mapped_space = true; + } else { + // Mark the thread as exiting without freeing pthread_internal_t. + thread->attr.flags |= PTHREAD_ATTR_FLAG_ZOMBIE; } pthread_mutex_unlock(&g_thread_list_lock); |