uterm: vt: fix race by blocking signals before setting them
authorDavid Herrmann <dh.herrmann@googlemail.com>
Sun, 28 Oct 2012 15:17:18 +0000 (16:17 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Sun, 28 Oct 2012 15:17:18 +0000 (16:17 +0100)
We must block the signals before setting the signal handlers to avoid
retrieving them asynchronously.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/uterm_vt.c

index 433c6be..3e77870 100644 (file)
@@ -312,6 +312,16 @@ static int real_open(struct uterm_vt *vt, const char *vt_for_seat0)
                goto err_reset;
        }
 
+       sigemptyset(&mask);
+       sigaddset(&mask, SIGUSR1);
+       sigaddset(&mask, SIGUSR2);
+       ret = sigprocmask(SIG_BLOCK, &mask, NULL);
+       if (ret) {
+               log_error("cannot block SIGUSR1/2 (%d): %m", errno);
+               ret = -EFAULT;
+               goto err_text;
+       }
+
        memset(&mode, 0, sizeof(mode));
        mode.mode = VT_PROCESS;
        mode.acqsig = SIGUSR1;
@@ -343,13 +353,6 @@ static int real_open(struct uterm_vt *vt, const char *vt_for_seat0)
                goto err_setmode;
        }
 
-       sigemptyset(&mask);
-       sigaddset(&mask, SIGUSR1);
-       sigaddset(&mask, SIGUSR2);
-       ret = sigprocmask(SIG_BLOCK, &mask, NULL);
-       if (ret)
-               log_warning("cannot ignore SIGUSR1/2 (%d): %m", errno);
-
        return 0;
 
 err_setmode: