Browse Source

fix several locks that weren't updated right for new futex-based __lock

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.
rs-1.0
Rich Felker 14 years ago
parent
commit
bbbe87e35c
  1. 6
      src/internal/pthread_impl.h
  2. 6
      src/thread/pthread_create.c
  3. 4
      src/thread/pthread_detach.c
  4. 4
      src/thread/pthread_kill.c

6
src/internal/pthread_impl.h

@ -28,13 +28,12 @@ struct pthread {
pid_t tid, pid; pid_t tid, pid;
int tsd_used, errno_val, *errno_ptr; int tsd_used, errno_val, *errno_ptr;
volatile int cancel, canceldisable, cancelasync; volatile int cancel, canceldisable, cancelasync;
int detached;
unsigned char *map_base; unsigned char *map_base;
size_t map_size; size_t map_size;
void *start_arg; void *start_arg;
void *(*start)(void *); void *(*start)(void *);
void *result; void *result;
int detached;
int exitlock;
struct __ptcb *cancelbuf; struct __ptcb *cancelbuf;
void **tsd; void **tsd;
pthread_attr_t attr; pthread_attr_t attr;
@ -47,7 +46,8 @@ struct pthread {
int unblock_cancel; int unblock_cancel;
int delete_timer; int delete_timer;
locale_t locale; locale_t locale;
int killlock; int killlock[2];
int exitlock[2];
}; };
struct __timer { struct __timer {

6
src/thread/pthread_create.c

@ -24,12 +24,12 @@ void pthread_exit(void *result)
__pthread_tsd_run_dtors(); __pthread_tsd_run_dtors();
__lock(&self->exitlock); __lock(self->exitlock);
/* Mark this thread dead before decrementing count */ /* Mark this thread dead before decrementing count */
__lock(&self->killlock); __lock(self->killlock);
self->dead = 1; self->dead = 1;
a_store(&self->killlock, 0); __unlock(self->killlock);
do n = libc.threads_minus_1; do n = libc.threads_minus_1;
while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n); while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n);

4
src/thread/pthread_detach.c

@ -3,9 +3,9 @@
int pthread_detach(pthread_t t) int pthread_detach(pthread_t t)
{ {
/* Cannot detach a thread that's already exiting */ /* 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); return pthread_join(t, 0);
t->detached = 2; t->detached = 2;
a_store(&t->exitlock, 0); __unlock(t->exitlock);
return 0; return 0;
} }

4
src/thread/pthread_kill.c

@ -3,8 +3,8 @@
int pthread_kill(pthread_t t, int sig) int pthread_kill(pthread_t t, int sig)
{ {
int r; int r;
__lock(&t->killlock); __lock(t->killlock);
r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig); r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig);
__unlock(&t->killlock); __unlock(t->killlock);
return r; return r;
} }

Loading…
Cancel
Save