>From 025fe623db26a1c963e8fbbbf3f8a2434861f101 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 6 Jan 2017 18:49:54 +0100 Subject: [PATCH 3/3] lock: Fix resource deallocation upon failure. * lib/glthread/lock.c (glthread_rwlock_init_multithreaded): Destroy already allocated objects upon failure. (glthread_rwlock_unlock_multithreaded): Attempt to destroy all subobjects even if not all destructions succeed. Reported by Torvald Riegel . --- ChangeLog | 9 +++++++++ lib/glthread/lock.c | 26 +++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5f410f..1c0f60a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2017-01-06 Bruno Haible + lock: Fix resource deallocation upon failure. + * lib/glthread/lock.c (glthread_rwlock_init_multithreaded): Destroy + already allocated objects upon failure. + (glthread_rwlock_unlock_multithreaded): Attempt to destroy all + subobjects even if not all destructions succeed. + Reported by Torvald Riegel . + +2017-01-06 Bruno Haible + lock: Improve destruction. * lib/glthread/lock.c (glthread_rwlock_destroy_multithreaded): Destroy the wait queues before the lock. diff --git a/lib/glthread/lock.c b/lib/glthread/lock.c index b0f78f4..d765cd3 100644 --- a/lib/glthread/lock.c +++ b/lib/glthread/lock.c @@ -195,10 +195,17 @@ glthread_rwlock_init_multithreaded (gl_rwlock_t *lock) return err; err = pthread_cond_init (&lock->waiting_readers, NULL); if (err != 0) - return err; + { + pthread_mutex_destroy (&lock->lock); + return err; + } err = pthread_cond_init (&lock->waiting_writers, NULL); if (err != 0) - return err; + { + pthread_cond_destroy (&lock->waiting_readers); + pthread_mutex_destroy (&lock->lock); + return err; + } lock->waiting_writers_count = 0; lock->runcount = 0; return 0; @@ -317,18 +324,19 @@ glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock) int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock) { + int ret = 0; int err; err = pthread_cond_destroy (&lock->waiting_readers); - if (err != 0) - return err; + if (err != 0 && ret == 0) + ret = err; err = pthread_cond_destroy (&lock->waiting_writers); - if (err != 0) - return err; + if (err != 0 && ret == 0) + ret = err; err = pthread_mutex_destroy (&lock->lock); - if (err != 0) - return err; - return 0; + if (err != 0 && ret == 0) + ret = err; + return ret; } # endif -- 2.6.4