1355641Skevans/*- 2355641Skevans * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3355641Skevans * 4355641Skevans * Copyright (c) 2019 Kyle Evans <kevans@FreeBSD.org> 5355641Skevans * All rights reserved. 6355641Skevans * 7355641Skevans * Redistribution and use in source and binary forms, with or without 8355641Skevans * modification, are permitted provided that the following conditions 9355641Skevans * are met: 10355641Skevans * 1. Redistributions of source code must retain the above copyright 11355641Skevans * notice, this list of conditions and the following disclaimer. 12355641Skevans * 2. Redistributions in binary form must reproduce the above copyright 13355641Skevans * notice, this list of conditions and the following disclaimer in the 14355641Skevans * documentation and/or other materials provided with the distribution. 15355641Skevans * 16355641Skevans * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17355641Skevans * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18355641Skevans * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19355641Skevans * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20355641Skevans * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21355641Skevans * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22355641Skevans * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23355641Skevans * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24355641Skevans * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25355641Skevans * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26355641Skevans * SUCH DAMAGE. 27355641Skevans */ 28355641Skevans 29355641Skevans#include <sys/cdefs.h> 30355641Skevans__FBSDID("$FreeBSD: stable/11/lib/libc/tests/gen/sigsetops_test.c 355898 2019-12-19 02:09:16Z kevans $"); 31355641Skevans 32355641Skevans#include <errno.h> 33355641Skevans#include <signal.h> 34355641Skevans#include <stdbool.h> 35355641Skevans 36355641Skevans#include <atf-c.h> 37355641Skevans 38355641Skevans/* Return the status of the specified sig's bit. */ 39355641Skevansstatic bool 40355641Skevanssigbitstatus(const sigset_t *set, int sig) 41355641Skevans{ 42355641Skevans 43355641Skevans return (set->__bits[_SIG_WORD(sig)] & _SIG_BIT(sig)) != 0; 44355641Skevans} 45355641Skevans 46355641Skevans/* Verify that sig is the lone bit set in the sigset. */ 47355641Skevansstatic void 48355641Skevanssiglonebit(const sigset_t *set, int sig) 49355641Skevans{ 50355641Skevans int i; 51355641Skevans 52355641Skevans for (i = 0; i < _SIG_WORDS; ++i) { 53355641Skevans if (i != _SIG_WORD(sig)) 54355641Skevans ATF_REQUIRE_MSG(set->__bits[i] == 0, 55355641Skevans "word %d altered to %x", i, set->__bits[i]); 56355641Skevans else 57355641Skevans ATF_REQUIRE_MSG((set->__bits[i] & ~_SIG_BIT(sig)) == 0, 58355641Skevans "word %d has other bits set: %x", i, 59355641Skevans set->__bits[i] & ~_SIG_BIT(sig)); 60355641Skevans } 61355641Skevans} 62355641Skevans 63355641Skevansstatic void 64355641Skevanssigcompare(const sigset_t *left, const sigset_t *right) 65355641Skevans{ 66355641Skevans int i; 67355641Skevans 68355641Skevans for (i = 0; i < _SIG_WORDS; ++i) { 69355641Skevans ATF_REQUIRE_MSG(left->__bits[i] == right->__bits[i], 70355641Skevans "sig comparison failed at %d; left=%x, right=%x", 71355641Skevans i, left->__bits[i], right->__bits[i]); 72355641Skevans } 73355641Skevans} 74355641Skevans 75355641Skevans/* 76355641Skevans * Test implementation details of our sigsetops... make sure the correct bits 77355641Skevans * are getting set, for the most part, and that duplicate operations don't 78355641Skevans * error out. 79355641Skevans */ 80355641SkevansATF_TC_WITHOUT_HEAD(posix_sigsetop_test); 81355641SkevansATF_TC_BODY(posix_sigsetop_test, tc) 82355641Skevans{ 83355641Skevans sigset_t set; 84355641Skevans int i; 85355641Skevans 86355641Skevans ATF_REQUIRE(sigfillset(&set) == 0); 87355641Skevans for (i = 0; i < _SIG_WORDS; ++i) { 88355641Skevans ATF_REQUIRE_MSG(set.__bits[i] == ~0U, "sigfillset failed @ %d", 89355641Skevans i); 90355641Skevans } 91355641Skevans ATF_REQUIRE(sigemptyset(&set) == 0); 92355641Skevans for (i = 0; i < _SIG_WORDS; ++i) { 93355641Skevans ATF_REQUIRE_MSG(set.__bits[i] == 0, "sigemptyset failed @ %d", 94355641Skevans i); 95355641Skevans } 96355641Skevans /* Ensure that sigismember reflects the empty set status. */ 97355641Skevans for (i = 1; i < NSIG; ++i) { 98355641Skevans ATF_REQUIRE(sigismember(&set, i) == 0); 99355641Skevans } 100355641Skevans 101355641Skevans ATF_REQUIRE(sigaddset(&set, -1) == -1 && errno == EINVAL); 102355641Skevans ATF_REQUIRE(sigaddset(&set, _SIG_MAXSIG + 1) == -1 && errno == EINVAL); 103355641Skevans ATF_REQUIRE(sigdelset(&set, -1) == -1 && errno == EINVAL); 104355641Skevans ATF_REQUIRE(sigdelset(&set, _SIG_MAXSIG + 1) == -1 && errno == EINVAL); 105355641Skevans 106355641Skevans ATF_REQUIRE(sigaddset(&set, SIGSEGV) == 0); 107355641Skevans ATF_REQUIRE(sigismember(&set, SIGSEGV) != 0); 108355641Skevans ATF_REQUIRE_MSG(sigbitstatus(&set, SIGSEGV), "sigaddset failure"); 109355641Skevans siglonebit(&set, SIGSEGV); 110355641Skevans 111355641Skevans /* 112355641Skevans * A second addition should succeed without altering the state. This 113355641Skevans * should be trivially true. 114355641Skevans */ 115355641Skevans ATF_REQUIRE(sigaddset(&set, SIGSEGV) == 0); 116355641Skevans ATF_REQUIRE_MSG(sigbitstatus(&set, SIGSEGV), 117355641Skevans "sigaddset twice changed bit"); 118355641Skevans 119355641Skevans ATF_REQUIRE(sigdelset(&set, SIGSEGV) == 0); 120355641Skevans ATF_REQUIRE_MSG(!sigbitstatus(&set, SIGSEGV), "sigdelset failure"); 121355641Skevans ATF_REQUIRE(sigismember(&set, SIGSEGV) == 0); 122355641Skevans ATF_REQUIRE(sigdelset(&set, SIGSEGV) == 0); 123355641Skevans ATF_REQUIRE_MSG(!sigbitstatus(&set, SIGSEGV), 124355641Skevans "sigdelset twice changed bit"); 125355641Skevans for (i = 0; i < _SIG_WORDS; ++i) { 126355641Skevans ATF_REQUIRE_MSG(set.__bits[i] == 0, "set not empty @ %d", 127355641Skevans i); 128355641Skevans } 129355641Skevans for (i = 1; i < NSIG; ++i) { 130355641Skevans ATF_REQUIRE(sigismember(&set, i) == 0); 131355641Skevans } 132355641Skevans} 133355641Skevans 134355641Skevans/* 135355641Skevans * Test extended sigset ops for union/intersection and testing of empty set. 136355641Skevans */ 137355641SkevansATF_TC_WITHOUT_HEAD(extended_sigsetop_test); 138355641SkevansATF_TC_BODY(extended_sigsetop_test, tc) 139355641Skevans{ 140355641Skevans sigset_t chkset, set1, set2, set3; 141355641Skevans 142355641Skevans sigemptyset(&chkset); 143355641Skevans sigemptyset(&set1); 144355641Skevans sigemptyset(&set2); 145355641Skevans ATF_REQUIRE(sigisemptyset(&chkset) != 0); 146355641Skevans sigaddset(&set1, SIGSEGV); 147355641Skevans sigaddset(&set2, SIGKILL); 148355641Skevans sigaddset(&chkset, SIGSEGV); 149355641Skevans ATF_REQUIRE(sigisemptyset(&chkset) == 0); 150355641Skevans sigaddset(&chkset, SIGKILL); 151355641Skevans ATF_REQUIRE(sigorset(&set3, &set1, &set2) == 0); 152355641Skevans ATF_REQUIRE(sigbitstatus(&set3, SIGSEGV)); 153355641Skevans ATF_REQUIRE(sigbitstatus(&set3, SIGKILL)); 154355641Skevans 155355641Skevans /* 156355641Skevans * chkset was built with our POSIX-specified set operations that we've 157355641Skevans * already tested, so it's a good comparison. 158355641Skevans */ 159355641Skevans sigcompare(&chkset, &set3); 160355641Skevans /* 161355641Skevans * Clear chkset; make sure sigisemptyset() still looks ok. sigaddset 162355641Skevans * and sigdelset have already been tested to make sure that they're not 163355641Skevans * touching other bits. 164355641Skevans */ 165355641Skevans sigdelset(&chkset, SIGSEGV); 166355641Skevans sigdelset(&chkset, SIGKILL); 167355641Skevans ATF_REQUIRE(sigisemptyset(&chkset) != 0); 168355641Skevans ATF_REQUIRE(sigandset(&set3, &set1, &set2) == 0); 169355641Skevans /* Make sure we clobbered these. */ 170355641Skevans ATF_REQUIRE(!sigbitstatus(&set3, SIGSEGV)); 171355641Skevans ATF_REQUIRE(!sigbitstatus(&set3, SIGKILL)); 172355641Skevans ATF_REQUIRE(sigisemptyset(&set3) != 0); 173355641Skevans /* Rebuild for sigandset test */ 174355641Skevans sigemptyset(&set1); 175355641Skevans sigemptyset(&set2); 176355641Skevans sigaddset(&set1, SIGSEGV); 177355641Skevans sigaddset(&set1, SIGKILL); 178355641Skevans sigaddset(&set2, SIGSEGV); 179355641Skevans ATF_REQUIRE(sigandset(&set3, &set1, &set2) == 0); 180355641Skevans ATF_REQUIRE(sigbitstatus(&set3, SIGSEGV)); 181355641Skevans ATF_REQUIRE(!sigbitstatus(&set3, SIGKILL)); 182355641Skevans} 183355641Skevans 184355641SkevansATF_TP_ADD_TCS(tp) 185355641Skevans{ 186355641Skevans 187355641Skevans ATF_TP_ADD_TC(tp, posix_sigsetop_test); 188355641Skevans ATF_TP_ADD_TC(tp, extended_sigsetop_test); 189355641Skevans 190355641Skevans return (atf_no_error()); 191355641Skevans} 192