From bc3ec7bd45814a75845529fd0aca5c5a9d9f0c14 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sat, 31 Oct 2009 11:53:41 +0100 Subject: [PATCH] unblock signals we might want to handle On Thu, Oct 29, 2009 at 19:15, Christian P. Schmidt wrote: > After the getty replaces itself with login the pam module pam_mount > calls mount. This in turn determines that the partition to be mounted is > LUKS encrypted, and calls cryptsetup. Cryptsetup receives the password, > unlocks the partition, and calls udevadm settle in order to avoid some > problems in interaction with LVM. > > udevadm settle never returns. > > The problem here is that SIGUSR1 and SIGALRM are both blocked in oldmask > already, and never reach udevadm. No care is ever taken to ensure those > signals are not blocked. --- udev/test-udev.c | 6 ++++++ udev/udevadm-monitor.c | 5 +++++ udev/udevadm-settle.c | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/udev/test-udev.c b/udev/test-udev.c index 0806fbf9..bd61aa06 100644 --- a/udev/test-udev.c +++ b/udev/test-udev.c @@ -52,6 +52,7 @@ int main(int argc, char *argv[]) const char *action; const char *subsystem; struct sigaction act; + sigset_t mask; int err = -EINVAL; udev = udev_new(); @@ -68,6 +69,11 @@ int main(int argc, char *argv[]) sigaction(SIGALRM, &act, NULL); sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); + sigemptyset(&mask); + sigaddset(&mask, SIGALRM); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGTERM); + sigprocmask(SIG_UNBLOCK, &mask, NULL); /* trigger timeout to prevent hanging processes */ alarm(UDEV_EVENT_TIMEOUT); diff --git a/udev/udevadm-monitor.c b/udev/udevadm-monitor.c index 90388db5..00b130da 100644 --- a/udev/udevadm-monitor.c +++ b/udev/udevadm-monitor.c @@ -67,6 +67,7 @@ static void print_device(struct udev_device *device, const char *source, int pro int udevadm_monitor(struct udev *udev, int argc, char *argv[]) { struct sigaction act; + sigset_t mask; int option; int prop = 0; int print_kernel = 0; @@ -142,6 +143,10 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) act.sa_flags = SA_RESTART; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGTERM); + sigprocmask(SIG_UNBLOCK, &mask, NULL); printf("monitor will print the received events for:\n"); if (print_udev) { diff --git a/udev/udevadm-settle.c b/udev/udevadm-settle.c index 5030f186..4f422f90 100644 --- a/udev/udevadm-settle.c +++ b/udev/udevadm-settle.c @@ -66,6 +66,7 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[]) const char *exists = NULL; int timeout = DEFAULT_TIMEOUT; struct sigaction act; + sigset_t mask; struct udev_queue *udev_queue = NULL; int rc = 1; @@ -78,6 +79,10 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[]) act.sa_flags = 0; sigaction(SIGALRM, &act, NULL); sigaction(SIGUSR1, &act, NULL); + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + sigaddset(&mask, SIGALRM); + sigprocmask(SIG_UNBLOCK, &mask, NULL); while (1) { int option; @@ -163,7 +168,7 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[]) uctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH); if (uctrl != NULL) { - sigset_t mask, oldmask; + sigset_t oldmask; sigemptyset(&mask); sigaddset(&mask, SIGUSR1); -- 2.39.5