summaryrefslogtreecommitdiff
path: root/debian/patches/libpthread_pthreadexit-safety.patch
blob: 57dac1f0119c1176c9b87b7065ec89f9d40896e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
As documented in pthread_exit(), the joiner has to make sure the thread really
is dead before freeing its stack.

Note: Neal fixed it another way on 2008-08-16, drop this patch then.

Index: libpthread/pthread/pt-detach.c
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-detach.c,v
retrieving revision 1.2
diff -u -p -r1.2 pt-detach.c
--- libpthread/pthread/pt-detach.c	4 May 2005 16:04:06 -0000	1.2
+++ libpthread/pthread/pt-detach.c	8 Jul 2008 23:25:07 -0000
@@ -58,6 +58,9 @@ pthread_detach (pthread_t thread)
 
       __pthread_mutex_unlock (&pthread->state_lock);
 
+      /* Make sure that the kernel thread is dead.  */
+      __thread_terminate (pthread->kernel_thread);
+
       assert (pthread->stack);
       __pthread_stack_dealloc (pthread->stackaddr, pthread->stacksize);
       pthread->stack = 0;
Index: libpthread/pthread/pt-join.c
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-join.c,v
retrieving revision 1.1
diff -u -p -r1.1 pt-join.c
--- libpthread/pthread/pt-join.c	10 Oct 2002 23:05:06 -0000	1.1
+++ libpthread/pthread/pt-join.c	8 Jul 2008 23:25:07 -0000
@@ -53,6 +53,9 @@ pthread_join (pthread_t thread, void **s
       if (status)
 	*status = pthread->status;
 
+      /* Make sure that the kernel thread is dead.  */
+      __thread_terminate (pthread->kernel_thread);
+
       /* Make sure nobody can reference it anymore, and mark it as
          terminated.  */
       assert (pthread->stack);