1dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes/* 2dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Check decoding of sigprocmask syscall. 3dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 4dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org> 5dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * All rights reserved. 6dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 7dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Redistribution and use in source and binary forms, with or without 8dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * modification, are permitted provided that the following conditions 9dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * are met: 10dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 1. Redistributions of source code must retain the above copyright 11dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * notice, this list of conditions and the following disclaimer. 12dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 13dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * notice, this list of conditions and the following disclaimer in the 14dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * documentation and/or other materials provided with the distribution. 15dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 3. The name of the author may not be used to endorse or promote products 16dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * derived from this software without specific prior written permission. 17dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * 18dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes */ 29dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 30dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#include "tests.h" 31dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#include <asm/unistd.h> 32dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 33dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#ifdef __NR_sigprocmask 34dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 35dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# include <signal.h> 36dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# include <stdint.h> 37dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# include <stdio.h> 38dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# include <string.h> 39dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# include <unistd.h> 40dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 41dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesstatic const char *errstr; 42dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 43dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesstatic long 44dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesk_sigprocmask(const kernel_ulong_t how, const kernel_ulong_t new_set, 45dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes const kernel_ulong_t old_set) 46dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{ 47dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes const long rc = syscall(__NR_sigprocmask, how, new_set, old_set); 48dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes errstr = sprintrc(rc); 49dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes return rc; 50dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes} 51dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 52dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesint 53dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesmain(void) 54dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{ 55dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes static const kernel_ulong_t sig_block = 56dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (kernel_ulong_t) 0xfacefeed00000000ULL | SIG_BLOCK; 57dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes static const kernel_ulong_t sig_unblock = 58dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (kernel_ulong_t) 0xfacefeed00000000ULL | SIG_UNBLOCK; 59dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes static const kernel_ulong_t sig_setmask = 60dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (kernel_ulong_t) 0xfacefeed00000000ULL | SIG_SETMASK; 61dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 62dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (k_sigprocmask(sig_setmask, 0, 0)) 63dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_skip("sigprocmask"); 64dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigprocmask(SIG_SETMASK, NULL, NULL) = 0"); 65dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 66dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(kernel_ulong_t, new_set); 67dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(kernel_ulong_t, old_set); 68dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set); 69dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 70dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes memset(new_set, 0, sizeof(*new_set)); 71dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_setmask, (uintptr_t) new_set, 0); 72dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_SETMASK, [], NULL) = %s\n", errstr); 73dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 74dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_unblock, 75dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintptr_t) (new_set - 1), (uintptr_t) old_set); 76dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigprocmask(SIG_UNBLOCK, ~[], []) = 0"); 77dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 78dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (F8ILL_KULONG_SUPPORTED) { 79dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_unblock, f8ill_ptr_to_kulong(new_set), 0); 80dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_UNBLOCK, %#jx, NULL) = %s\n", 81dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintmax_t) f8ill_ptr_to_kulong(new_set), errstr); 82dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 83dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_unblock, 0, f8ill_ptr_to_kulong(old_set)); 84dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_UNBLOCK, NULL, %#jx) = %s\n", 85dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintmax_t) f8ill_ptr_to_kulong(old_set), errstr); 86dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes } 87dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 88dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigemptyset(libc_set); 89dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGHUP); 90dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes memcpy(new_set, libc_set, sizeof(*new_set)); 91dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 92dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_block, (uintptr_t) new_set, (uintptr_t) old_set); 93dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigprocmask(SIG_BLOCK, [HUP], []) = 0"); 94dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 95dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes memset(libc_set, -1, sizeof(*libc_set)); 96dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigdelset(libc_set, SIGHUP); 97dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes memcpy(new_set, libc_set, sizeof(*new_set)); 98dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 99dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_unblock, (uintptr_t) new_set, (uintptr_t) old_set); 100dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigprocmask(SIG_UNBLOCK, ~[HUP], [HUP]) = 0"); 101dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 102dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigdelset(libc_set, SIGKILL); 103dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes memcpy(new_set, libc_set, sizeof(*new_set)); 104dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 105dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_unblock, (uintptr_t) new_set, (uintptr_t) old_set); 106dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigprocmask(SIG_UNBLOCK, ~[HUP KILL], [HUP]) = 0"); 107dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 108dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigemptyset(libc_set); 109dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGHUP); 110dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGINT); 111dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGQUIT); 112dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGALRM); 113dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGTERM); 114dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes memcpy(new_set, libc_set, sizeof(*new_set)); 115dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 116dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_block, (uintptr_t) new_set, (uintptr_t) old_set); 117dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_BLOCK, %s, [HUP]) = 0\n", 118dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes "[HUP INT QUIT ALRM TERM]"); 119dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 120dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_setmask, 0, (uintptr_t) old_set); 121dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_SETMASK, NULL, %s) = 0\n", 122dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes "[HUP INT QUIT ALRM TERM]"); 123dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 124dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_setmask, (uintptr_t) (new_set + 1), 0); 125dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_SETMASK, %p, NULL) = %s\n", 126dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes new_set + 1, errstr); 127dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 128dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_setmask, 129dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintptr_t) new_set, (uintptr_t) (old_set + 1)); 130dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_SETMASK, %s, %p) = %s\n", 131dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes "[HUP INT QUIT ALRM TERM]", old_set + 1, errstr); 132dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 133dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes uintptr_t efault = sizeof(*new_set) / 2 + (uintptr_t) new_set; 134dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 135dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_setmask, efault, 0); 136dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_SETMASK, %#jx, NULL) = %s\n", 137dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintmax_t) efault, errstr); 138dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 139dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigprocmask(sig_setmask, 0, efault); 140dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigprocmask(SIG_SETMASK, NULL, %#jx) = %s\n", 141dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintmax_t) efault, errstr); 142dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 143dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("+++ exited with 0 +++"); 144dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes return 0; 145dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes} 146dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 147dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#else 148dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 149dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott HughesSKIP_MAIN_UNDEFINED("__NR_sigprocmask") 150dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 151dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#endif 152