fix several locks that weren't updated right for new futex-based __lock
authorRich Felker <dalias@aerifal.cx>
Thu, 12 Jul 2012 15:23:43 +0000 (11:23 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 12 Jul 2012 15:23:43 +0000 (11:23 -0400)
these could have caused memory corruption due to invalid accesses to
the next field. all should be fixed now; I found the errors with fgrep
-r '__lock(&', which is bogus since the argument should be an array.

src/internal/pthread_impl.h
src/thread/pthread_create.c
src/thread/pthread_detach.c
src/thread/pthread_kill.c

index 0ce3c1e..46d8fdd 100644 (file)
@@ -28,13 +28,12 @@ struct pthread {
        pid_t tid, pid;
        int tsd_used, errno_val, *errno_ptr;
        volatile int cancel, canceldisable, cancelasync;
+       int detached;
        unsigned char *map_base;
        size_t map_size;
        void *start_arg;
        void *(*start)(void *);
        void *result;
-       int detached;
-       int exitlock;
        struct __ptcb *cancelbuf;
        void **tsd;
        pthread_attr_t attr;
@@ -47,7 +46,8 @@ struct pthread {
        int unblock_cancel;
        int delete_timer;
        locale_t locale;
-       int killlock;
+       int killlock[2];
+       int exitlock[2];
 };
 
 struct __timer {
index ae2f9e4..94dc308 100644 (file)
@@ -24,12 +24,12 @@ void pthread_exit(void *result)
 
        __pthread_tsd_run_dtors();
 
-       __lock(&self->exitlock);
+       __lock(self->exitlock);
 
        /* Mark this thread dead before decrementing count */
-       __lock(&self->killlock);
+       __lock(self->killlock);
        self->dead = 1;
-       a_store(&self->killlock, 0);
+       __unlock(self->killlock);
 
        do n = libc.threads_minus_1;
        while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n);
index e803239..651c38e 100644 (file)
@@ -3,9 +3,9 @@
 int pthread_detach(pthread_t t)
 {
        /* Cannot detach a thread that's already exiting */
-       if (a_swap(&t->exitlock, 1))
+       if (a_swap(t->exitlock, 1))
                return pthread_join(t, 0);
        t->detached = 2;
-       a_store(&t->exitlock, 0);
+       __unlock(t->exitlock);
        return 0;
 }
index 15f70fb..d9a5096 100644 (file)
@@ -3,8 +3,8 @@
 int pthread_kill(pthread_t t, int sig)
 {
        int r;
-       __lock(&t->killlock);
+       __lock(t->killlock);
        r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig);
-       __unlock(&t->killlock);
+       __unlock(t->killlock);
        return r;
 }