1dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes/* 2dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Check decoding of sigpending 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_sigpending 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_sigpending(const kernel_ulong_t set) 45dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{ 46dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes const long rc = syscall(__NR_sigpending, set); 47dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes errstr = sprintrc(rc); 48dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes return rc; 49dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes} 50dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 51dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesint 52dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesmain(void) 53dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{ 54dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(kernel_ulong_t, k_set); 55dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set); 56dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 57dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigemptyset(libc_set); 58dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (sigprocmask(SIG_SETMASK, libc_set, NULL)) 59dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("sigprocmask"); 60dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 61dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (k_sigpending((uintptr_t) libc_set)) 62dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_skip("sigpending"); 63dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes else 64dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigpending([]) = 0"); 65dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 66dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigpending((uintptr_t) k_set); 67dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigpending([]) = 0"); 68dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 69dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigpending((uintptr_t) (k_set + 1)); 70dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigpending(%p) = -1 EFAULT (%m)\n", k_set + 1); 71dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 72dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes uintptr_t efault = sizeof(*k_set) / 2 + (uintptr_t) k_set; 73dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigpending(efault); 74dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigpending(%#jx) = -1 EFAULT (%m)\n", (uintmax_t) efault); 75dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 76dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGHUP); 77dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (sigprocmask(SIG_SETMASK, libc_set, NULL)) 78dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("sigprocmask"); 79dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes raise(SIGHUP); 80dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 81dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigpending((uintptr_t) k_set); 82dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigpending([HUP]) = 0"); 83dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 84dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes sigaddset(libc_set, SIGINT); 85dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (sigprocmask(SIG_SETMASK, libc_set, NULL)) 86dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes perror_msg_and_fail("sigprocmask"); 87dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes raise(SIGINT); 88dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 89dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigpending((uintptr_t) k_set); 90dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("sigpending([HUP INT]) = 0"); 91dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 92dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (F8ILL_KULONG_SUPPORTED) { 93dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes k_sigpending(f8ill_ptr_to_kulong(k_set)); 94dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes printf("sigpending(%#jx) = %s\n", 95dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes (uintmax_t) f8ill_ptr_to_kulong(k_set), errstr); 96dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes } 97dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 98dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes puts("+++ exited with 0 +++"); 99dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes return 0; 100dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes} 101dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 102dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#else 103dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 104dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott HughesSKIP_MAIN_UNDEFINED("__NR_sigpending") 105dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 106dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes#endif 107