Commit 47a654f0 ("libmpathutil: udev: prevent interruption by thread
cancellation") added pthread_testcancel() calls to the udev command
wrappers. This makes these commands cancellation points (but only after
any waiting has already happened without cancellation), while the rest
of the code assumes that they are not.

This can cause problems like in uev_update_path() when multipathd first
calls udev_device_unref(pp->udev) and afterwards resets pp->udev. If the
thread is cancelled after unref'ing device in the udev_device_unref()
call, pp->udev will still point to the now-freed udev_device.

Fixes: 47a654f0 ("libmpathutil: udev: prevent interruption by thread 
cancellation")
Signed-off-by: Benjamin Marzinski <[email protected]>
---
 libmpathutil/mt-libudev.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/libmpathutil/mt-libudev.c b/libmpathutil/mt-libudev.c
index 813ce588..b81cf9c6 100644
--- a/libmpathutil/mt-libudev.c
+++ b/libmpathutil/mt-libudev.c
@@ -14,7 +14,6 @@ static pthread_mutex_t libudev_mutex = 
PTHREAD_MUTEX_INITIALIZER;
                __r = func();                                           \
                pthread_mutex_unlock(&libudev_mutex);                   \
                pthread_setcancelstate(__oldstate, NULL);               \
-               pthread_testcancel();                                   \
                return __r;                                             \
        }
 
@@ -27,7 +26,6 @@ static pthread_mutex_t libudev_mutex = 
PTHREAD_MUTEX_INITIALIZER;
                __r = func(__arg1);                                             
\
                pthread_mutex_unlock(&libudev_mutex);                   \
                pthread_setcancelstate(__oldstate, NULL);               \
-               pthread_testcancel();                                   \
                return __r;                                             \
        }
 
@@ -40,7 +38,6 @@ static pthread_mutex_t libudev_mutex = 
PTHREAD_MUTEX_INITIALIZER;
                __r = func(__arg1, __arg2);                             \
                pthread_mutex_unlock(&libudev_mutex);                   \
                pthread_setcancelstate(__oldstate, NULL);               \
-               pthread_testcancel();                                   \
                return __r;                                             \
        }
 
@@ -53,7 +50,6 @@ static pthread_mutex_t libudev_mutex = 
PTHREAD_MUTEX_INITIALIZER;
                __r = func(__arg1, __arg2, __arg3);                     \
                pthread_mutex_unlock(&libudev_mutex);                   \
                pthread_setcancelstate(__oldstate, NULL);               \
-               pthread_testcancel();                                   \
                return __r;                                             \
        }
 
-- 
2.46.1


Reply via email to