Fix race condition in stop_waiter_thread()
authorHannes Reinecke <hare@suse.de>
Tue, 8 Jan 2013 13:54:08 +0000 (14:54 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Tue, 8 Jan 2013 23:11:23 +0000 (00:11 +0100)
The signal handler might run before we had a chance to
set the 'waiter' context to '0', so better do it previously.

Signed-off-by: Hannes Reinecke <hare@suse.de>
libmultipath/waiter.c

index 076539c..da71543 100644 (file)
@@ -45,6 +45,8 @@ void free_waiter (void *data)
 
 void stop_waiter_thread (struct multipath *mpp, struct vectors *vecs)
 {
+       pthread_t thread;
+
        if (mpp->waiter == (pthread_t)0) {
                condlog(3, "%s: event checker thread already stopped",
                        mpp->alias);
@@ -52,8 +54,9 @@ void stop_waiter_thread (struct multipath *mpp, struct vectors *vecs)
        }
        condlog(2, "%s: stop event checker thread (%lu)", mpp->alias,
                mpp->waiter);
-       pthread_cancel(mpp->waiter);
+       thread = mpp->waiter;
        mpp->waiter = (pthread_t)0;
+       pthread_cancel(thread);
 }
 
 /*