1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* 2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * This file is part of rt_sigpending strace test. 3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org> 539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2016-2017 The strace developers. 6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved. 7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without 9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions 10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met: 11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright 12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer. 13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer in the 15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * documentation and/or other materials provided with the distribution. 16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products 17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * derived from this software without specific prior written permission. 18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */ 30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h" 32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <asm/unistd.h> 33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef __NR_rt_sigpending 35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <assert.h> 37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <signal.h> 38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdio.h> 39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <string.h> 40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <unistd.h> 41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic long 43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesk_sigpending(void *const set, const unsigned long size) 44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return syscall(__NR_rt_sigpending, set, size); 46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void 49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesiterate(const char *const text, unsigned int size, void *set) 50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes for (;;) { 52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (k_sigpending(set, size)) { 53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%p, %u) = -1 EFAULT (%m)\n", 54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes set, size); 55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (size) { 58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#if WORDS_BIGENDIAN 59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (size < sizeof(long)) 60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%s, %u) = 0\n", 61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes "[]", size); 62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes else 63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif 64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%s, %u) = 0\n", 65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes text, size); 66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else { 67d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%p, %u) = 0\n", set, size); 68d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 70d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes size >>= 1; 71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes set += size; 72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint 76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(void) 77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("%s", ""); 79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const unsigned int big_size = 1024 / 8; 81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes void *k_set = tail_alloc(big_size); 8239bac055674d23770b9a724221b728e443196ea7Elliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set); 83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigemptyset(libc_set); 85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (sigprocmask(SIG_SETMASK, libc_set, NULL)) 86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("sigprocmask"); 87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes memset(k_set, 0, big_size); 89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes unsigned int set_size = big_size; 90d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes for (; set_size; set_size >>= 1, k_set += set_size) { 91d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (!k_sigpending(k_set, set_size)) 92d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes break; 93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%p, %u) = -1 EINVAL (%m)\n", 94d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes k_set, set_size); 95d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (!set_size) 97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("rt_sigpending"); 98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%s, %u) = 0\n", "[]", set_size); 99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes iterate("[]", set_size >> 1, k_set + (set_size >> 1)); 101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes void *const efault = k_set + (set_size >> 1); 103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes assert(k_sigpending(efault, set_size) == -1); 104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("rt_sigpending(%p, %u) = -1 EFAULT (%m)\n", 105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes efault, set_size); 106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigaddset(libc_set, SIGHUP); 108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (sigprocmask(SIG_SETMASK, libc_set, NULL)) 109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("sigprocmask"); 110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes raise(SIGHUP); 111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 112d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes iterate("[HUP]", set_size, k_set); 113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes sigaddset(libc_set, SIGINT); 115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (sigprocmask(SIG_SETMASK, libc_set, NULL)) 116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_fail("sigprocmask"); 117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes raise(SIGINT); 118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes iterate("[HUP INT]", set_size, k_set); 120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf("+++ exited with 0 +++\n"); 122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 0; 123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else 126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesSKIP_MAIN_UNDEFINED("__NR_rt_sigpending") 128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif 130