Don't corrupt the thread list if the main thread exits.
...and don't pass a non-heap pointer to free(3), either.
This patch replaces the "node** prev" with the clearer "node* prev"
style and fixes the null pointer dereference in the old code. That's
not sufficient to fix the reporter's bug, though. The pthread_internal_t*
for the main thread isn't heap-allocated --- __libc_init_tls causes a
pointer to a statically-allocated pthread_internal_t to be added to
the thread list.
Bug: http://code.google.com/p/android/issues/detail?id=37410
Change-Id: I112b7f22782fc789d58f9c783f7b323bda8fb8b7
diff --git a/libc/bionic/pthread_internal.h b/libc/bionic/pthread_internal.h
index a6b44c7..bc68291 100644
--- a/libc/bionic/pthread_internal.h
+++ b/libc/bionic/pthread_internal.h
@@ -36,9 +36,10 @@
typedef struct pthread_internal_t
{
struct pthread_internal_t* next;
- struct pthread_internal_t** prev;
+ struct pthread_internal_t* prev;
pthread_attr_t attr;
pid_t kernel_id;
+ bool allocated_on_heap;
pthread_cond_t join_cond;
int join_count;
void* return_value;