diff options
| author | 2015-10-22 05:30:18 +0000 | |
|---|---|---|
| committer | 2015-10-22 05:30:18 +0000 | |
| commit | 3ba3a6efbc5ac3517ca770c970552e70fabc95d5 (patch) | |
| tree | 21eda2b2c543ae722cd4f542b6fa10cdf454c8ef /regress/lib/libc/sigthr/sigthr_test.c | |
| parent | Pledge "stdio rpath tty" for hangman(6). (diff) | |
| download | wireguard-openbsd-3ba3a6efbc5ac3517ca770c970552e70fabc95d5.tar.xz wireguard-openbsd-3ba3a6efbc5ac3517ca770c970552e70fabc95d5.zip | |
Add a regress for libc handling of SIGTHR
Diffstat (limited to 'regress/lib/libc/sigthr/sigthr_test.c')
| -rw-r--r-- | regress/lib/libc/sigthr/sigthr_test.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/regress/lib/libc/sigthr/sigthr_test.c b/regress/lib/libc/sigthr/sigthr_test.c new file mode 100644 index 00000000000..c2eaa1f7796 --- /dev/null +++ b/regress/lib/libc/sigthr/sigthr_test.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org> + * + * Public domain. + * + * Verify that SIGTHR can't be blocked or caught by applications. + */ + +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <signal.h> + +void sighandler(int sig) { } + +int +main(void) +{ + struct sigaction sa; + sigset_t set, oset; + + /* + * check sigprocmask + */ + if (sigprocmask(SIG_BLOCK, NULL, &set)) + err(1, "sigprocmask"); + if (sigismember(&set, SIGTHR)) + errx(1, "SIGTHR already blocked"); + sigaddset(&set, SIGTHR); + if (sigprocmask(SIG_BLOCK, &set, NULL)) + err(1, "sigprocmask"); + if (sigprocmask(SIG_SETMASK, &set, &oset)) + err(1, "sigprocmask"); + if (sigismember(&oset, SIGTHR)) + errx(1, "SIGTHR blocked with SIG_BLOCK"); + if (sigprocmask(SIG_BLOCK, NULL, &oset)) + err(1, "sigprocmask"); + if (sigismember(&oset, SIGTHR)) + errx(1, "SIGTHR blocked with SIG_SETMASK"); + + /* + * check sigaction + */ + if (sigaction(SIGTHR, NULL, &sa) == 0) + errx(1, "sigaction(SIGTHR) succeeded"); + else if (errno != EINVAL) + err(1, "sigaction(SIGTHR) didn't fail with EINVAL"); + memset(&sa, 0, sizeof sa); + sa.sa_handler = sighandler; + sigfillset(&sa.sa_mask); + sa.sa_flags = 0; + if (sigaction(SIGTHR, &sa, NULL) == 0) + errx(1, "sigaction(SIGTHR) succeeded"); + else if (errno != EINVAL) + err(1, "sigaction(SIGTHR) didn't fail with EINVAL"); + if (sigaction(SIGUSR1, &sa, NULL)) + err(1, "sigaction(SIGUSR1)"); + if (sigaction(SIGUSR1, NULL, &sa)) + err(1, "sigaction(SIGUSR1)"); + if (sigismember(&sa.sa_mask, SIGTHR)) + errx(1, "SIGTHR blocked with sigaction"); + + return 0; +} |
