1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-23 21:35:11 +03:00

unblock signals we might want to handle

On Thu, Oct 29, 2009 at 19:15, Christian P. Schmidt <schmidt@digadd.de> 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.
This commit is contained in:
Kay Sievers 2009-10-31 11:53:41 +01:00
parent 88fbff03df
commit bc3ec7bd45
3 changed files with 17 additions and 1 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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);