diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-12-14 16:33:50 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-12-14 16:33:50 +0000 |
commit | fbaf6e72d676629c21d00eab5824571b1b26a2b2 (patch) | |
tree | 24eac15a02a6ea5f04df569a4c6519b13612afca /linuxthreads/spinlock.c | |
parent | 60876a75445b1b65e4a0ec54e18205a79f79466b (diff) | |
download | glibc-fbaf6e72d676629c21d00eab5824571b1b26a2b2.zip glibc-fbaf6e72d676629c21d00eab5824571b1b26a2b2.tar.gz glibc-fbaf6e72d676629c21d00eab5824571b1b26a2b2.tar.bz2 |
Update.
* spinlock.c (__pthread_unlock): Don"t crash if called for an
untaken mutex. Reported by Ruslan V. Brushkoff <rus@Snif.Te.Net.UA>.
Diffstat (limited to 'linuxthreads/spinlock.c')
-rw-r--r-- | linuxthreads/spinlock.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 00a8691..c8f8f71 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -65,9 +65,11 @@ void internal_function __pthread_unlock(struct _pthread_fastlock * lock) again: oldstatus = lock->__status; - if (oldstatus == 1) { - /* No threads are waiting for this lock */ - if (! compare_and_swap(&lock->__status, 1, 0, &lock->__spinlock)) + if (oldstatus == 0 || oldstatus == 1) { + /* No threads are waiting for this lock. Please note that we also + enter this case if the lock is not taken at all. If this wouldn't + be done here we would crash further down. */ + if (! compare_and_swap(&lock->__status, oldstatus, 0, &lock->__spinlock)) goto again; return; } |