On Mon, 2026-08-10 at 17:05 -0400, Benjamin Marzinski wrote:
> 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]>

Reviewed-by: Martin Wilck <[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;                                          \
>       }
>  

-- 
Dr. Martin Wilck <[email protected]>
SUSE Software Solutions Germany GmbH, Frankenstr. 146, 90461 Nürnberg,
Germany
Geschäftsführer: Jochen Jaser, Andrew McDonald (HRB 36809,AG Nürnberg)

Reply via email to