id = 834 title = "linux-user: fails to deliver signals raised during pselect" state = "closed" created_at = "2022-01-23T01:02:55.512Z" closed_at = "2022-03-24T20:08:18.931Z" labels = ["Closed::Fixed", "kind::Bug", "linux-user"] url = "https://gitlab.com/qemu-project/qemu/-/issues/834" host-os = "NixOS" host-arch = "x86_64" qemu-version = "qemu-x86_64 version 6.2.50 (v6.2.0-1117-gaeb0ae95b7)" guest-os = "n/a" guest-arch = "n/a" description = """When run via qemu a program which blocks signals but unmasks them during `pselect` does not catch these signals when returning from `pselect`. Used as reference on expected behavior: [The new pselect() system call](https://lwn.net/Articles/176911/)""" reproduce = """A minimal test case below mimics behavior as encountered in the test suite of `p11-kit` ([link](https://github.com/p11-glue/p11-kit)) (which attempts to catch `SIGTERM` in a similar way and results in lingering processes after running the test suite). ```C #include #include #include #include static void handler(int sig) { \tputs("SIGNAL"); } int main(int argc, char *argv[]) { \tstruct sigaction sa; \tfd_set rfds; \tsigset_t emptyset, blockset; \tsigemptyset (&blockset); \tsigemptyset (&emptyset); \tsigaddset (&blockset, SIGUSR1); \tsa.sa_handler = handler; \tsigemptyset(&sa.sa_mask); \tsa.sa_flags = 0; \tsigaction(SIGUSR1, &sa, NULL); \tsigprocmask (SIG_BLOCK, &blockset, NULL); \tFD_ZERO(&rfds); \twhile(1) { \t\tpselect(0, &rfds, NULL, NULL, NULL, &emptyset); \t} \treturn 0; } ``` Running this without qemu should print _SIGNAL_ when sent `SIGUSR1`: ``` $ ./a.out & [1] 1683587 $ kill -USR1 %1 $ SIGNAL ``` When run with `qemu-x86_64` however, it does not (also qemu's `-strace` confirms the signal isn't received whereas a strace of qemu shows it's in fact delivered). The pselect call itself _is_ interrupted, but the signal goes missing.""" additional = "n/a"