1d3bfc725SMariusz Zaborski /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 328b6f7c8SMariusz Zaborski * 4d3bfc725SMariusz Zaborski * Copyright (c) 2013 The FreeBSD Foundation 5d3bfc725SMariusz Zaborski * 6d3bfc725SMariusz Zaborski * This software was developed by Pawel Jakub Dawidek under sponsorship from 7d3bfc725SMariusz Zaborski * the FreeBSD Foundation. 8d3bfc725SMariusz Zaborski * 9d3bfc725SMariusz Zaborski * Redistribution and use in source and binary forms, with or without 10d3bfc725SMariusz Zaborski * modification, are permitted provided that the following conditions 11d3bfc725SMariusz Zaborski * are met: 12d3bfc725SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright 13d3bfc725SMariusz Zaborski * notice, this list of conditions and the following disclaimer. 14d3bfc725SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright 15d3bfc725SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the 16d3bfc725SMariusz Zaborski * documentation and/or other materials provided with the distribution. 17d3bfc725SMariusz Zaborski * 18d3bfc725SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 19d3bfc725SMariusz Zaborski * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20d3bfc725SMariusz Zaborski * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21d3bfc725SMariusz Zaborski * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 22d3bfc725SMariusz Zaborski * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23d3bfc725SMariusz Zaborski * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24d3bfc725SMariusz Zaborski * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25d3bfc725SMariusz Zaborski * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26d3bfc725SMariusz Zaborski * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27d3bfc725SMariusz Zaborski * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28d3bfc725SMariusz Zaborski * SUCH DAMAGE. 29d3bfc725SMariusz Zaborski */ 30d3bfc725SMariusz Zaborski 31d3bfc725SMariusz Zaborski #include <sys/capsicum.h> 32ceb36bc9SMariusz Zaborski #include <sys/nv.h> 33d3bfc725SMariusz Zaborski 34d3bfc725SMariusz Zaborski #include <assert.h> 35d3bfc725SMariusz Zaborski #include <err.h> 36d3bfc725SMariusz Zaborski #include <errno.h> 37d3bfc725SMariusz Zaborski #include <grp.h> 38d3bfc725SMariusz Zaborski #include <stdio.h> 39d3bfc725SMariusz Zaborski #include <stdlib.h> 40d3bfc725SMariusz Zaborski #include <string.h> 41d3bfc725SMariusz Zaborski #include <unistd.h> 42d3bfc725SMariusz Zaborski 43d3bfc725SMariusz Zaborski #include <libcasper.h> 44d3bfc725SMariusz Zaborski 45d3bfc725SMariusz Zaborski #include <casper/cap_grp.h> 46d3bfc725SMariusz Zaborski 47d3bfc725SMariusz Zaborski static int ntest = 1; 48d3bfc725SMariusz Zaborski 49d3bfc725SMariusz Zaborski #define CHECK(expr) do { \ 50d3bfc725SMariusz Zaborski if ((expr)) \ 51d3bfc725SMariusz Zaborski printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \ 52d3bfc725SMariusz Zaborski else \ 53d3bfc725SMariusz Zaborski printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \ 54ebe3e93cSEnji Cooper fflush(stdout); \ 55d3bfc725SMariusz Zaborski ntest++; \ 56d3bfc725SMariusz Zaborski } while (0) 57d3bfc725SMariusz Zaborski #define CHECKX(expr) do { \ 58d3bfc725SMariusz Zaborski if ((expr)) { \ 59d3bfc725SMariusz Zaborski printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \ 60d3bfc725SMariusz Zaborski } else { \ 61d3bfc725SMariusz Zaborski printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \ 62d3bfc725SMariusz Zaborski exit(1); \ 63d3bfc725SMariusz Zaborski } \ 64ebe3e93cSEnji Cooper fflush(stdout); \ 65d3bfc725SMariusz Zaborski ntest++; \ 66d3bfc725SMariusz Zaborski } while (0) 67d3bfc725SMariusz Zaborski 68d3bfc725SMariusz Zaborski #define GID_WHEEL 0 69d3bfc725SMariusz Zaborski #define GID_OPERATOR 5 70d3bfc725SMariusz Zaborski 71d3bfc725SMariusz Zaborski #define GETGRENT0 0x0001 72d3bfc725SMariusz Zaborski #define GETGRENT1 0x0002 73d3bfc725SMariusz Zaborski #define GETGRENT2 0x0004 74d3bfc725SMariusz Zaborski #define GETGRENT (GETGRENT0 | GETGRENT1 | GETGRENT2) 75d3bfc725SMariusz Zaborski #define GETGRENT_R0 0x0008 76d3bfc725SMariusz Zaborski #define GETGRENT_R1 0x0010 77d3bfc725SMariusz Zaborski #define GETGRENT_R2 0x0020 78d3bfc725SMariusz Zaborski #define GETGRENT_R (GETGRENT_R0 | GETGRENT_R1 | GETGRENT_R2) 79d3bfc725SMariusz Zaborski #define GETGRNAM 0x0040 80d3bfc725SMariusz Zaborski #define GETGRNAM_R 0x0080 81d3bfc725SMariusz Zaborski #define GETGRGID 0x0100 82d3bfc725SMariusz Zaborski #define GETGRGID_R 0x0200 83d3bfc725SMariusz Zaborski #define SETGRENT 0x0400 84d3bfc725SMariusz Zaborski 85d3bfc725SMariusz Zaborski static bool 86d3bfc725SMariusz Zaborski group_mem_compare(char **mem0, char **mem1) 87d3bfc725SMariusz Zaborski { 88d3bfc725SMariusz Zaborski int i0, i1; 89d3bfc725SMariusz Zaborski 90d3bfc725SMariusz Zaborski if (mem0 == NULL && mem1 == NULL) 91d3bfc725SMariusz Zaborski return (true); 92d3bfc725SMariusz Zaborski if (mem0 == NULL || mem1 == NULL) 93d3bfc725SMariusz Zaborski return (false); 94d3bfc725SMariusz Zaborski 95d3bfc725SMariusz Zaborski for (i0 = 0; mem0[i0] != NULL; i0++) { 96d3bfc725SMariusz Zaborski for (i1 = 0; mem1[i1] != NULL; i1++) { 97d3bfc725SMariusz Zaborski if (strcmp(mem0[i0], mem1[i1]) == 0) 98d3bfc725SMariusz Zaborski break; 99d3bfc725SMariusz Zaborski } 100d3bfc725SMariusz Zaborski if (mem1[i1] == NULL) 101d3bfc725SMariusz Zaborski return (false); 102d3bfc725SMariusz Zaborski } 103d3bfc725SMariusz Zaborski 104d3bfc725SMariusz Zaborski return (true); 105d3bfc725SMariusz Zaborski } 106d3bfc725SMariusz Zaborski 107d3bfc725SMariusz Zaborski static bool 108d3bfc725SMariusz Zaborski group_compare(const struct group *grp0, const struct group *grp1) 109d3bfc725SMariusz Zaborski { 110d3bfc725SMariusz Zaborski 111d3bfc725SMariusz Zaborski if (grp0 == NULL && grp1 == NULL) 112d3bfc725SMariusz Zaborski return (true); 113d3bfc725SMariusz Zaborski if (grp0 == NULL || grp1 == NULL) 114d3bfc725SMariusz Zaborski return (false); 115d3bfc725SMariusz Zaborski 116d3bfc725SMariusz Zaborski if (strcmp(grp0->gr_name, grp1->gr_name) != 0) 117d3bfc725SMariusz Zaborski return (false); 118d3bfc725SMariusz Zaborski 119d3bfc725SMariusz Zaborski if (grp0->gr_passwd != NULL || grp1->gr_passwd != NULL) { 120d3bfc725SMariusz Zaborski if (grp0->gr_passwd == NULL || grp1->gr_passwd == NULL) 121d3bfc725SMariusz Zaborski return (false); 122d3bfc725SMariusz Zaborski if (strcmp(grp0->gr_passwd, grp1->gr_passwd) != 0) 123d3bfc725SMariusz Zaborski return (false); 124d3bfc725SMariusz Zaborski } 125d3bfc725SMariusz Zaborski 126d3bfc725SMariusz Zaborski if (grp0->gr_gid != grp1->gr_gid) 127d3bfc725SMariusz Zaborski return (false); 128d3bfc725SMariusz Zaborski 129d3bfc725SMariusz Zaborski if (!group_mem_compare(grp0->gr_mem, grp1->gr_mem)) 130d3bfc725SMariusz Zaborski return (false); 131d3bfc725SMariusz Zaborski 132d3bfc725SMariusz Zaborski return (true); 133d3bfc725SMariusz Zaborski } 134d3bfc725SMariusz Zaborski 135d3bfc725SMariusz Zaborski static unsigned int 136d3bfc725SMariusz Zaborski runtest_cmds(cap_channel_t *capgrp) 137d3bfc725SMariusz Zaborski { 138d3bfc725SMariusz Zaborski char bufs[1024], bufc[1024]; 139d3bfc725SMariusz Zaborski unsigned int result; 140d3bfc725SMariusz Zaborski struct group *grps, *grpc; 141d3bfc725SMariusz Zaborski struct group sts, stc; 142d3bfc725SMariusz Zaborski 143d3bfc725SMariusz Zaborski result = 0; 144d3bfc725SMariusz Zaborski 145d3bfc725SMariusz Zaborski (void)setgrent(); 146d3bfc725SMariusz Zaborski if (cap_setgrent(capgrp) == 1) 147d3bfc725SMariusz Zaborski result |= SETGRENT; 148d3bfc725SMariusz Zaborski 149d3bfc725SMariusz Zaborski grps = getgrent(); 150d3bfc725SMariusz Zaborski grpc = cap_getgrent(capgrp); 151d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) { 152d3bfc725SMariusz Zaborski result |= GETGRENT0; 153d3bfc725SMariusz Zaborski grps = getgrent(); 154d3bfc725SMariusz Zaborski grpc = cap_getgrent(capgrp); 155d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 156d3bfc725SMariusz Zaborski result |= GETGRENT1; 157d3bfc725SMariusz Zaborski } 158d3bfc725SMariusz Zaborski 159d3bfc725SMariusz Zaborski getgrent_r(&sts, bufs, sizeof(bufs), &grps); 160d3bfc725SMariusz Zaborski cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc); 161d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) { 162d3bfc725SMariusz Zaborski result |= GETGRENT_R0; 163d3bfc725SMariusz Zaborski getgrent_r(&sts, bufs, sizeof(bufs), &grps); 164d3bfc725SMariusz Zaborski cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc); 165d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 166d3bfc725SMariusz Zaborski result |= GETGRENT_R1; 167d3bfc725SMariusz Zaborski } 168d3bfc725SMariusz Zaborski 169d3bfc725SMariusz Zaborski (void)setgrent(); 170d3bfc725SMariusz Zaborski if (cap_setgrent(capgrp) == 1) 171d3bfc725SMariusz Zaborski result |= SETGRENT; 172d3bfc725SMariusz Zaborski 173d3bfc725SMariusz Zaborski getgrent_r(&sts, bufs, sizeof(bufs), &grps); 174d3bfc725SMariusz Zaborski cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc); 175d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 176d3bfc725SMariusz Zaborski result |= GETGRENT_R2; 177d3bfc725SMariusz Zaborski 178d3bfc725SMariusz Zaborski grps = getgrent(); 179d3bfc725SMariusz Zaborski grpc = cap_getgrent(capgrp); 180d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 181d3bfc725SMariusz Zaborski result |= GETGRENT2; 182d3bfc725SMariusz Zaborski 183d3bfc725SMariusz Zaborski grps = getgrnam("wheel"); 184d3bfc725SMariusz Zaborski grpc = cap_getgrnam(capgrp, "wheel"); 185d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) { 186d3bfc725SMariusz Zaborski grps = getgrnam("operator"); 187d3bfc725SMariusz Zaborski grpc = cap_getgrnam(capgrp, "operator"); 188d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 189d3bfc725SMariusz Zaborski result |= GETGRNAM; 190d3bfc725SMariusz Zaborski } 191d3bfc725SMariusz Zaborski 192d3bfc725SMariusz Zaborski getgrnam_r("wheel", &sts, bufs, sizeof(bufs), &grps); 193d3bfc725SMariusz Zaborski cap_getgrnam_r(capgrp, "wheel", &stc, bufc, sizeof(bufc), &grpc); 194d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) { 195d3bfc725SMariusz Zaborski getgrnam_r("operator", &sts, bufs, sizeof(bufs), &grps); 196d3bfc725SMariusz Zaborski cap_getgrnam_r(capgrp, "operator", &stc, bufc, sizeof(bufc), 197d3bfc725SMariusz Zaborski &grpc); 198d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 199d3bfc725SMariusz Zaborski result |= GETGRNAM_R; 200d3bfc725SMariusz Zaborski } 201d3bfc725SMariusz Zaborski 202d3bfc725SMariusz Zaborski grps = getgrgid(GID_WHEEL); 203d3bfc725SMariusz Zaborski grpc = cap_getgrgid(capgrp, GID_WHEEL); 204d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) { 205d3bfc725SMariusz Zaborski grps = getgrgid(GID_OPERATOR); 206d3bfc725SMariusz Zaborski grpc = cap_getgrgid(capgrp, GID_OPERATOR); 207d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 208d3bfc725SMariusz Zaborski result |= GETGRGID; 209d3bfc725SMariusz Zaborski } 210d3bfc725SMariusz Zaborski 211d3bfc725SMariusz Zaborski getgrgid_r(GID_WHEEL, &sts, bufs, sizeof(bufs), &grps); 212d3bfc725SMariusz Zaborski cap_getgrgid_r(capgrp, GID_WHEEL, &stc, bufc, sizeof(bufc), &grpc); 213d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) { 214d3bfc725SMariusz Zaborski getgrgid_r(GID_OPERATOR, &sts, bufs, sizeof(bufs), &grps); 215d3bfc725SMariusz Zaborski cap_getgrgid_r(capgrp, GID_OPERATOR, &stc, bufc, sizeof(bufc), 216d3bfc725SMariusz Zaborski &grpc); 217d3bfc725SMariusz Zaborski if (group_compare(grps, grpc)) 218d3bfc725SMariusz Zaborski result |= GETGRGID_R; 219d3bfc725SMariusz Zaborski } 220d3bfc725SMariusz Zaborski 221d3bfc725SMariusz Zaborski return (result); 222d3bfc725SMariusz Zaborski } 223d3bfc725SMariusz Zaborski 224d3bfc725SMariusz Zaborski static void 225d3bfc725SMariusz Zaborski test_cmds(cap_channel_t *origcapgrp) 226d3bfc725SMariusz Zaborski { 227d3bfc725SMariusz Zaborski cap_channel_t *capgrp; 228d3bfc725SMariusz Zaborski const char *cmds[7], *fields[4], *names[5]; 229d3bfc725SMariusz Zaborski gid_t gids[5]; 230d3bfc725SMariusz Zaborski 231d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 232d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 233d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 234d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 235d3bfc725SMariusz Zaborski 236d3bfc725SMariusz Zaborski names[0] = "wheel"; 237d3bfc725SMariusz Zaborski names[1] = "daemon"; 238d3bfc725SMariusz Zaborski names[2] = "kmem"; 239d3bfc725SMariusz Zaborski names[3] = "sys"; 240d3bfc725SMariusz Zaborski names[4] = "operator"; 241d3bfc725SMariusz Zaborski 242d3bfc725SMariusz Zaborski gids[0] = 0; 243d3bfc725SMariusz Zaborski gids[1] = 1; 244d3bfc725SMariusz Zaborski gids[2] = 2; 245d3bfc725SMariusz Zaborski gids[3] = 3; 246d3bfc725SMariusz Zaborski gids[4] = 5; 247d3bfc725SMariusz Zaborski 248d3bfc725SMariusz Zaborski /* 249d3bfc725SMariusz Zaborski * Allow: 250d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r, 251d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 252d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 253d3bfc725SMariusz Zaborski * groups: 254d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 255d3bfc725SMariusz Zaborski * gids: 256d3bfc725SMariusz Zaborski */ 257d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 258d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 259d3bfc725SMariusz Zaborski 260d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 261d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 262d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 263d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 264d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 265d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 266d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 267d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0); 268d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 269d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 270d3bfc725SMariusz Zaborski 271d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 272d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 273d3bfc725SMariusz Zaborski 274d3bfc725SMariusz Zaborski cap_close(capgrp); 275d3bfc725SMariusz Zaborski 276d3bfc725SMariusz Zaborski /* 277d3bfc725SMariusz Zaborski * Allow: 278d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r, 279d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 280d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 281d3bfc725SMariusz Zaborski * groups: 282d3bfc725SMariusz Zaborski * names: 283d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 284d3bfc725SMariusz Zaborski */ 285d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 286d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 287d3bfc725SMariusz Zaborski 288d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 289d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 290d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 291d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 292d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 293d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 294d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 295d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0); 296d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 297d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 298d3bfc725SMariusz Zaborski 299d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 300d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 301d3bfc725SMariusz Zaborski 302d3bfc725SMariusz Zaborski cap_close(capgrp); 303d3bfc725SMariusz Zaborski 304d3bfc725SMariusz Zaborski /* 305d3bfc725SMariusz Zaborski * Allow: 306d3bfc725SMariusz Zaborski * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r, 307d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 308d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 309d3bfc725SMariusz Zaborski * groups: 310d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 311d3bfc725SMariusz Zaborski * gids: 312d3bfc725SMariusz Zaborski * Disallow: 313d3bfc725SMariusz Zaborski * cmds: setgrent 314d3bfc725SMariusz Zaborski * fields: 315d3bfc725SMariusz Zaborski * groups: 316d3bfc725SMariusz Zaborski */ 317d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 318d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 319d3bfc725SMariusz Zaborski 3201a05d951SMark Johnston cap_setgrent(capgrp); 3211a05d951SMark Johnston 322d3bfc725SMariusz Zaborski cmds[0] = "getgrent"; 323d3bfc725SMariusz Zaborski cmds[1] = "getgrent_r"; 324d3bfc725SMariusz Zaborski cmds[2] = "getgrnam"; 325d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 326d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 327d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 328d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 329d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 330d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 331d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 332d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 333d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 334d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 335d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 336d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 337d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 338d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 339d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 340d3bfc725SMariusz Zaborski 341d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 | 342d3bfc725SMariusz Zaborski GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 343d3bfc725SMariusz Zaborski 344d3bfc725SMariusz Zaborski cap_close(capgrp); 345d3bfc725SMariusz Zaborski 346d3bfc725SMariusz Zaborski /* 347d3bfc725SMariusz Zaborski * Allow: 348d3bfc725SMariusz Zaborski * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r, 349d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 350d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 351d3bfc725SMariusz Zaborski * groups: 352d3bfc725SMariusz Zaborski * names: 353d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 354d3bfc725SMariusz Zaborski * Disallow: 355d3bfc725SMariusz Zaborski * cmds: setgrent 356d3bfc725SMariusz Zaborski * fields: 357d3bfc725SMariusz Zaborski * groups: 358d3bfc725SMariusz Zaborski */ 359d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 360d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 361d3bfc725SMariusz Zaborski 3621a05d951SMark Johnston cap_setgrent(capgrp); 3631a05d951SMark Johnston 364d3bfc725SMariusz Zaborski cmds[0] = "getgrent"; 365d3bfc725SMariusz Zaborski cmds[1] = "getgrent_r"; 366d3bfc725SMariusz Zaborski cmds[2] = "getgrnam"; 367d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 368d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 369d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 370d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 371d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 372d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 373d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 374d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 375d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 376d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 377d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 378d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 379d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 380d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 381d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 382d3bfc725SMariusz Zaborski 383d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 | 384d3bfc725SMariusz Zaborski GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 385d3bfc725SMariusz Zaborski 386d3bfc725SMariusz Zaborski cap_close(capgrp); 387d3bfc725SMariusz Zaborski 388d3bfc725SMariusz Zaborski /* 389d3bfc725SMariusz Zaborski * Allow: 390d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r, 391d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 392d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 393d3bfc725SMariusz Zaborski * groups: 394d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 395d3bfc725SMariusz Zaborski * gids: 396d3bfc725SMariusz Zaborski * Disallow: 397d3bfc725SMariusz Zaborski * cmds: getgrent 398d3bfc725SMariusz Zaborski * fields: 399d3bfc725SMariusz Zaborski * groups: 400d3bfc725SMariusz Zaborski */ 401d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 402d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 403d3bfc725SMariusz Zaborski 404d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 405d3bfc725SMariusz Zaborski cmds[1] = "getgrent_r"; 406d3bfc725SMariusz Zaborski cmds[2] = "getgrnam"; 407d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 408d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 409d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 410d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 411d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 412d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 413d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 414d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 415d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 416d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 417d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 418d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 419d3bfc725SMariusz Zaborski cmds[0] = "getgrent"; 420d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 421d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 422d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 423d3bfc725SMariusz Zaborski 424d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 | 425d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 426d3bfc725SMariusz Zaborski 427d3bfc725SMariusz Zaborski cap_close(capgrp); 428d3bfc725SMariusz Zaborski 429d3bfc725SMariusz Zaborski /* 430d3bfc725SMariusz Zaborski * Allow: 431d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r, 432d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 433d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 434d3bfc725SMariusz Zaborski * groups: 435d3bfc725SMariusz Zaborski * names: 436d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 437d3bfc725SMariusz Zaborski * Disallow: 438d3bfc725SMariusz Zaborski * cmds: getgrent 439d3bfc725SMariusz Zaborski * fields: 440d3bfc725SMariusz Zaborski * groups: 441d3bfc725SMariusz Zaborski */ 442d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 443d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 444d3bfc725SMariusz Zaborski 445d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 446d3bfc725SMariusz Zaborski cmds[1] = "getgrent_r"; 447d3bfc725SMariusz Zaborski cmds[2] = "getgrnam"; 448d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 449d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 450d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 451d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 452d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 453d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 454d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 455d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 456d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 457d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 458d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 459d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 460d3bfc725SMariusz Zaborski cmds[0] = "getgrent"; 461d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 462d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 463d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 464d3bfc725SMariusz Zaborski 465d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 | 466d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 467d3bfc725SMariusz Zaborski 468d3bfc725SMariusz Zaborski cap_close(capgrp); 469d3bfc725SMariusz Zaborski 470d3bfc725SMariusz Zaborski /* 471d3bfc725SMariusz Zaborski * Allow: 472d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrnam, getgrnam_r, 473d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 474d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 475d3bfc725SMariusz Zaborski * groups: 476d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 477d3bfc725SMariusz Zaborski * gids: 478d3bfc725SMariusz Zaborski * Disallow: 479d3bfc725SMariusz Zaborski * cmds: getgrent_r 480d3bfc725SMariusz Zaborski * fields: 481d3bfc725SMariusz Zaborski * groups: 482d3bfc725SMariusz Zaborski */ 483d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 484d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 485d3bfc725SMariusz Zaborski 486d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 487d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 488d3bfc725SMariusz Zaborski cmds[2] = "getgrnam"; 489d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 490d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 491d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 492d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 493d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 494d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 495d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 496d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 497d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 498d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 499d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 500d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 501d3bfc725SMariusz Zaborski cmds[0] = "getgrent_r"; 502d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 503d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 504d3bfc725SMariusz Zaborski 505d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 | 506d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 507d3bfc725SMariusz Zaborski 508d3bfc725SMariusz Zaborski cap_close(capgrp); 509d3bfc725SMariusz Zaborski 510d3bfc725SMariusz Zaborski /* 511d3bfc725SMariusz Zaborski * Allow: 512d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrnam, getgrnam_r, 513d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 514d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 515d3bfc725SMariusz Zaborski * groups: 516d3bfc725SMariusz Zaborski * names: 517d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 518d3bfc725SMariusz Zaborski * Disallow: 519d3bfc725SMariusz Zaborski * cmds: getgrent_r 520d3bfc725SMariusz Zaborski * fields: 521d3bfc725SMariusz Zaborski * groups: 522d3bfc725SMariusz Zaborski */ 523d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 524d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 525d3bfc725SMariusz Zaborski 526d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 527d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 528d3bfc725SMariusz Zaborski cmds[2] = "getgrnam"; 529d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 530d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 531d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 532d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 533d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 534d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 535d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 536d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 537d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 538d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 539d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 540d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 541d3bfc725SMariusz Zaborski cmds[0] = "getgrent_r"; 542d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 543d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 544d3bfc725SMariusz Zaborski 545d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 | 546d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 547d3bfc725SMariusz Zaborski 548d3bfc725SMariusz Zaborski cap_close(capgrp); 549d3bfc725SMariusz Zaborski 550d3bfc725SMariusz Zaborski /* 551d3bfc725SMariusz Zaborski * Allow: 552d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam_r, 553d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 554d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 555d3bfc725SMariusz Zaborski * groups: 556d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 557d3bfc725SMariusz Zaborski * gids: 558d3bfc725SMariusz Zaborski * Disallow: 559d3bfc725SMariusz Zaborski * cmds: getgrnam 560d3bfc725SMariusz Zaborski * fields: 561d3bfc725SMariusz Zaborski * groups: 562d3bfc725SMariusz Zaborski */ 563d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 564d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 565d3bfc725SMariusz Zaborski 566d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 567d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 568d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 569d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 570d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 571d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 572d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 573d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 574d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 575d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 576d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 577d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 578d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 579d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 580d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 581d3bfc725SMariusz Zaborski cmds[0] = "getgrnam"; 582d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 583d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 584d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 585d3bfc725SMariusz Zaborski 586d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 587d3bfc725SMariusz Zaborski GETGRNAM_R | GETGRGID | GETGRGID_R)); 588d3bfc725SMariusz Zaborski 589d3bfc725SMariusz Zaborski cap_close(capgrp); 590d3bfc725SMariusz Zaborski 591d3bfc725SMariusz Zaborski /* 592d3bfc725SMariusz Zaborski * Allow: 593d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam_r, 594d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 595d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 596d3bfc725SMariusz Zaborski * groups: 597d3bfc725SMariusz Zaborski * names: 598d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 599d3bfc725SMariusz Zaborski * Disallow: 600d3bfc725SMariusz Zaborski * cmds: getgrnam 601d3bfc725SMariusz Zaborski * fields: 602d3bfc725SMariusz Zaborski * groups: 603d3bfc725SMariusz Zaborski */ 604d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 605d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 606d3bfc725SMariusz Zaborski 607d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 608d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 609d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 610d3bfc725SMariusz Zaborski cmds[3] = "getgrnam_r"; 611d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 612d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 613d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 614d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 615d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 616d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 617d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 618d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 619d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 620d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 621d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 622d3bfc725SMariusz Zaborski cmds[0] = "getgrnam"; 623d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 624d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 625d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 626d3bfc725SMariusz Zaborski 627d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 628d3bfc725SMariusz Zaborski GETGRNAM_R | GETGRGID | GETGRGID_R)); 629d3bfc725SMariusz Zaborski 630d3bfc725SMariusz Zaborski cap_close(capgrp); 631d3bfc725SMariusz Zaborski 632d3bfc725SMariusz Zaborski /* 633d3bfc725SMariusz Zaborski * Allow: 634d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, 635d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 636d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 637d3bfc725SMariusz Zaborski * groups: 638d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 639d3bfc725SMariusz Zaborski * gids: 640d3bfc725SMariusz Zaborski * Disallow: 641d3bfc725SMariusz Zaborski * cmds: getgrnam_r 642d3bfc725SMariusz Zaborski * fields: 643d3bfc725SMariusz Zaborski * groups: 644d3bfc725SMariusz Zaborski */ 645d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 646d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 647d3bfc725SMariusz Zaborski 648d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 649d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 650d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 651d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 652d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 653d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 654d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 655d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 656d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 657d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 658d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 659d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 660d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 661d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 662d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 663d3bfc725SMariusz Zaborski cmds[0] = "getgrnam_r"; 664d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 665d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 666d3bfc725SMariusz Zaborski 667d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 668d3bfc725SMariusz Zaborski GETGRNAM | GETGRGID | GETGRGID_R)); 669d3bfc725SMariusz Zaborski 670d3bfc725SMariusz Zaborski cap_close(capgrp); 671d3bfc725SMariusz Zaborski 672d3bfc725SMariusz Zaborski /* 673d3bfc725SMariusz Zaborski * Allow: 674d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, 675d3bfc725SMariusz Zaborski * getgrgid, getgrgid_r 676d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 677d3bfc725SMariusz Zaborski * groups: 678d3bfc725SMariusz Zaborski * names: 679d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 680d3bfc725SMariusz Zaborski * Disallow: 681d3bfc725SMariusz Zaborski * cmds: getgrnam_r 682d3bfc725SMariusz Zaborski * fields: 683d3bfc725SMariusz Zaborski * groups: 684d3bfc725SMariusz Zaborski */ 685d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 686d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 687d3bfc725SMariusz Zaborski 688d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 689d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 690d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 691d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 692d3bfc725SMariusz Zaborski cmds[4] = "getgrgid"; 693d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 694d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 695d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 696d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 697d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 698d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 699d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 700d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 701d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 702d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 703d3bfc725SMariusz Zaborski cmds[0] = "getgrnam_r"; 704d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 705d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 706d3bfc725SMariusz Zaborski 707d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 708d3bfc725SMariusz Zaborski GETGRNAM | GETGRGID | GETGRGID_R)); 709d3bfc725SMariusz Zaborski 710d3bfc725SMariusz Zaborski cap_close(capgrp); 711d3bfc725SMariusz Zaborski 712d3bfc725SMariusz Zaborski /* 713d3bfc725SMariusz Zaborski * Allow: 714d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r, 715d3bfc725SMariusz Zaborski * getgrgid_r 716d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 717d3bfc725SMariusz Zaborski * groups: 718d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 719d3bfc725SMariusz Zaborski * gids: 720d3bfc725SMariusz Zaborski * Disallow: 721d3bfc725SMariusz Zaborski * cmds: getgrgid 722d3bfc725SMariusz Zaborski * fields: 723d3bfc725SMariusz Zaborski * groups: 724d3bfc725SMariusz Zaborski */ 725d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 726d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 727d3bfc725SMariusz Zaborski 728d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 729d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 730d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 731d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 732d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 733d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 734d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 735d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 736d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 737d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 738d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 739d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 740d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 741d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 742d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 743d3bfc725SMariusz Zaborski cmds[0] = "getgrgid"; 744d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 745d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 746d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 747d3bfc725SMariusz Zaborski 748d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 749d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID_R)); 750d3bfc725SMariusz Zaborski 751d3bfc725SMariusz Zaborski cap_close(capgrp); 752d3bfc725SMariusz Zaborski 753d3bfc725SMariusz Zaborski /* 754d3bfc725SMariusz Zaborski * Allow: 755d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r, 756d3bfc725SMariusz Zaborski * getgrgid_r 757d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 758d3bfc725SMariusz Zaborski * groups: 759d3bfc725SMariusz Zaborski * names: 760d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 761d3bfc725SMariusz Zaborski * Disallow: 762d3bfc725SMariusz Zaborski * cmds: getgrgid 763d3bfc725SMariusz Zaborski * fields: 764d3bfc725SMariusz Zaborski * groups: 765d3bfc725SMariusz Zaborski */ 766d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 767d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 768d3bfc725SMariusz Zaborski 769d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 770d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 771d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 772d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 773d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 774d3bfc725SMariusz Zaborski cmds[5] = "getgrgid_r"; 775d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 776d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 777d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 778d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 779d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 780d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 781d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 782d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 783d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 784d3bfc725SMariusz Zaborski cmds[0] = "getgrgid"; 785d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 786d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 787d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 788d3bfc725SMariusz Zaborski 789d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 790d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID_R)); 791d3bfc725SMariusz Zaborski 792d3bfc725SMariusz Zaborski cap_close(capgrp); 793d3bfc725SMariusz Zaborski 794d3bfc725SMariusz Zaborski /* 795d3bfc725SMariusz Zaborski * Allow: 796d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r, 797d3bfc725SMariusz Zaborski * getgrgid 798d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 799d3bfc725SMariusz Zaborski * groups: 800d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, operator 801d3bfc725SMariusz Zaborski * gids: 802d3bfc725SMariusz Zaborski * Disallow: 803d3bfc725SMariusz Zaborski * cmds: getgrgid_r 804d3bfc725SMariusz Zaborski * fields: 805d3bfc725SMariusz Zaborski * groups: 806d3bfc725SMariusz Zaborski */ 807d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 808d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 809d3bfc725SMariusz Zaborski 810d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 811d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 812d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 813d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 814d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 815d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 816d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 817d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 818d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 819d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 820d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 821d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 822d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 823d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 824d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 825d3bfc725SMariusz Zaborski cmds[0] = "getgrgid_r"; 826d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 827d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 828d3bfc725SMariusz Zaborski 829d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 830d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID)); 831d3bfc725SMariusz Zaborski 832d3bfc725SMariusz Zaborski cap_close(capgrp); 833d3bfc725SMariusz Zaborski 834d3bfc725SMariusz Zaborski /* 835d3bfc725SMariusz Zaborski * Allow: 836d3bfc725SMariusz Zaborski * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r, 837d3bfc725SMariusz Zaborski * getgrgid 838d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 839d3bfc725SMariusz Zaborski * groups: 840d3bfc725SMariusz Zaborski * names: 841d3bfc725SMariusz Zaborski * gids: 0, 1, 2, 3, 5 842d3bfc725SMariusz Zaborski * Disallow: 843d3bfc725SMariusz Zaborski * cmds: getgrgid_r 844d3bfc725SMariusz Zaborski * fields: 845d3bfc725SMariusz Zaborski * groups: 846d3bfc725SMariusz Zaborski */ 847d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 848d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 849d3bfc725SMariusz Zaborski 850d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 851d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 852d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 853d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 854d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 855d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 856d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0); 857d3bfc725SMariusz Zaborski cmds[0] = "setgrent"; 858d3bfc725SMariusz Zaborski cmds[1] = "getgrent"; 859d3bfc725SMariusz Zaborski cmds[2] = "getgrent_r"; 860d3bfc725SMariusz Zaborski cmds[3] = "getgrnam"; 861d3bfc725SMariusz Zaborski cmds[4] = "getgrnam_r"; 862d3bfc725SMariusz Zaborski cmds[5] = "getgrgid"; 863d3bfc725SMariusz Zaborski cmds[6] = "getgrgid_r"; 864d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE); 865d3bfc725SMariusz Zaborski cmds[0] = "getgrgid_r"; 866d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE); 867d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0); 868d3bfc725SMariusz Zaborski 869d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 870d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID)); 871d3bfc725SMariusz Zaborski 872d3bfc725SMariusz Zaborski cap_close(capgrp); 873d3bfc725SMariusz Zaborski } 874d3bfc725SMariusz Zaborski 875d3bfc725SMariusz Zaborski #define GR_NAME 0x01 876d3bfc725SMariusz Zaborski #define GR_PASSWD 0x02 877d3bfc725SMariusz Zaborski #define GR_GID 0x04 878d3bfc725SMariusz Zaborski #define GR_MEM 0x08 879d3bfc725SMariusz Zaborski 880d3bfc725SMariusz Zaborski static unsigned int 881d3bfc725SMariusz Zaborski group_fields(const struct group *grp) 882d3bfc725SMariusz Zaborski { 883d3bfc725SMariusz Zaborski unsigned int result; 884d3bfc725SMariusz Zaborski 885d3bfc725SMariusz Zaborski result = 0; 886d3bfc725SMariusz Zaborski 887d3bfc725SMariusz Zaborski if (grp->gr_name != NULL && grp->gr_name[0] != '\0') 888d3bfc725SMariusz Zaborski result |= GR_NAME; 889d3bfc725SMariusz Zaborski 890d3bfc725SMariusz Zaborski if (grp->gr_passwd != NULL && grp->gr_passwd[0] != '\0') 891d3bfc725SMariusz Zaborski result |= GR_PASSWD; 892d3bfc725SMariusz Zaborski 893d3bfc725SMariusz Zaborski if (grp->gr_gid != (gid_t)-1) 894d3bfc725SMariusz Zaborski result |= GR_GID; 895d3bfc725SMariusz Zaborski 896d3bfc725SMariusz Zaborski if (grp->gr_mem != NULL && grp->gr_mem[0] != NULL) 897d3bfc725SMariusz Zaborski result |= GR_MEM; 898d3bfc725SMariusz Zaborski 899d3bfc725SMariusz Zaborski return (result); 900d3bfc725SMariusz Zaborski } 901d3bfc725SMariusz Zaborski 902d3bfc725SMariusz Zaborski static bool 903d3bfc725SMariusz Zaborski runtest_fields(cap_channel_t *capgrp, unsigned int expected) 904d3bfc725SMariusz Zaborski { 905d3bfc725SMariusz Zaborski char buf[1024]; 906d3bfc725SMariusz Zaborski struct group *grp; 907d3bfc725SMariusz Zaborski struct group st; 908d3bfc725SMariusz Zaborski 909d3bfc725SMariusz Zaborski (void)cap_setgrent(capgrp); 910d3bfc725SMariusz Zaborski grp = cap_getgrent(capgrp); 911d3bfc725SMariusz Zaborski if (group_fields(grp) != expected) 912d3bfc725SMariusz Zaborski return (false); 913d3bfc725SMariusz Zaborski 914d3bfc725SMariusz Zaborski (void)cap_setgrent(capgrp); 915d3bfc725SMariusz Zaborski cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp); 916d3bfc725SMariusz Zaborski if (group_fields(grp) != expected) 917d3bfc725SMariusz Zaborski return (false); 918d3bfc725SMariusz Zaborski 919d3bfc725SMariusz Zaborski grp = cap_getgrnam(capgrp, "wheel"); 920d3bfc725SMariusz Zaborski if (group_fields(grp) != expected) 921d3bfc725SMariusz Zaborski return (false); 922d3bfc725SMariusz Zaborski 923d3bfc725SMariusz Zaborski cap_getgrnam_r(capgrp, "wheel", &st, buf, sizeof(buf), &grp); 924d3bfc725SMariusz Zaborski if (group_fields(grp) != expected) 925d3bfc725SMariusz Zaborski return (false); 926d3bfc725SMariusz Zaborski 927d3bfc725SMariusz Zaborski grp = cap_getgrgid(capgrp, GID_WHEEL); 928d3bfc725SMariusz Zaborski if (group_fields(grp) != expected) 929d3bfc725SMariusz Zaborski return (false); 930d3bfc725SMariusz Zaborski 931d3bfc725SMariusz Zaborski cap_getgrgid_r(capgrp, GID_WHEEL, &st, buf, sizeof(buf), &grp); 932d3bfc725SMariusz Zaborski if (group_fields(grp) != expected) 933d3bfc725SMariusz Zaborski return (false); 934d3bfc725SMariusz Zaborski 935d3bfc725SMariusz Zaborski return (true); 936d3bfc725SMariusz Zaborski } 937d3bfc725SMariusz Zaborski 938d3bfc725SMariusz Zaborski static void 939d3bfc725SMariusz Zaborski test_fields(cap_channel_t *origcapgrp) 940d3bfc725SMariusz Zaborski { 941d3bfc725SMariusz Zaborski cap_channel_t *capgrp; 942d3bfc725SMariusz Zaborski const char *fields[4]; 943d3bfc725SMariusz Zaborski 944d3bfc725SMariusz Zaborski /* No limits. */ 945d3bfc725SMariusz Zaborski 946d3bfc725SMariusz Zaborski CHECK(runtest_fields(origcapgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM)); 947d3bfc725SMariusz Zaborski 948d3bfc725SMariusz Zaborski /* 949d3bfc725SMariusz Zaborski * Allow: 950d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid, gr_mem 951d3bfc725SMariusz Zaborski */ 952d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 953d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 954d3bfc725SMariusz Zaborski 955d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 956d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 957d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 958d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 959d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0); 960d3bfc725SMariusz Zaborski 961d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM)); 962d3bfc725SMariusz Zaborski 963d3bfc725SMariusz Zaborski cap_close(capgrp); 964d3bfc725SMariusz Zaborski 965d3bfc725SMariusz Zaborski /* 966d3bfc725SMariusz Zaborski * Allow: 967d3bfc725SMariusz Zaborski * fields: gr_passwd, gr_gid, gr_mem 968d3bfc725SMariusz Zaborski */ 969d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 970d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 971d3bfc725SMariusz Zaborski 972d3bfc725SMariusz Zaborski fields[0] = "gr_passwd"; 973d3bfc725SMariusz Zaborski fields[1] = "gr_gid"; 974d3bfc725SMariusz Zaborski fields[2] = "gr_mem"; 975d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0); 976d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 977d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 978d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 979d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 980d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 981d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 982d3bfc725SMariusz Zaborski 983d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID | GR_MEM)); 984d3bfc725SMariusz Zaborski 985d3bfc725SMariusz Zaborski cap_close(capgrp); 986d3bfc725SMariusz Zaborski 987d3bfc725SMariusz Zaborski /* 988d3bfc725SMariusz Zaborski * Allow: 989d3bfc725SMariusz Zaborski * fields: gr_name, gr_gid, gr_mem 990d3bfc725SMariusz Zaborski */ 991d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 992d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 993d3bfc725SMariusz Zaborski 994d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 995d3bfc725SMariusz Zaborski fields[1] = "gr_gid"; 996d3bfc725SMariusz Zaborski fields[2] = "gr_mem"; 997d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0); 998d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 999d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1000d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1001d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1002d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1003d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1004d3bfc725SMariusz Zaborski fields[0] = "gr_passwd"; 1005d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1006d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1007d3bfc725SMariusz Zaborski 1008d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_GID | GR_MEM)); 1009d3bfc725SMariusz Zaborski 1010d3bfc725SMariusz Zaborski cap_close(capgrp); 1011d3bfc725SMariusz Zaborski 1012d3bfc725SMariusz Zaborski /* 1013d3bfc725SMariusz Zaborski * Allow: 1014d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_mem 1015d3bfc725SMariusz Zaborski */ 1016d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1017d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1018d3bfc725SMariusz Zaborski 1019d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1020d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1021d3bfc725SMariusz Zaborski fields[2] = "gr_mem"; 1022d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0); 1023d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1024d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1025d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1026d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1027d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1028d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1029d3bfc725SMariusz Zaborski fields[0] = "gr_gid"; 1030d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1031d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1032d3bfc725SMariusz Zaborski 1033d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_MEM)); 1034d3bfc725SMariusz Zaborski 1035d3bfc725SMariusz Zaborski cap_close(capgrp); 1036d3bfc725SMariusz Zaborski 1037d3bfc725SMariusz Zaborski /* 1038d3bfc725SMariusz Zaborski * Allow: 1039d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd, gr_gid 1040d3bfc725SMariusz Zaborski */ 1041d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1042d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1043d3bfc725SMariusz Zaborski 1044d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1045d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1046d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1047d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0); 1048d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1049d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1050d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1051d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1052d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1053d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1054d3bfc725SMariusz Zaborski fields[0] = "gr_mem"; 1055d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1056d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1057d3bfc725SMariusz Zaborski 1058d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID)); 1059d3bfc725SMariusz Zaborski 1060d3bfc725SMariusz Zaborski cap_close(capgrp); 1061d3bfc725SMariusz Zaborski 1062d3bfc725SMariusz Zaborski /* 1063d3bfc725SMariusz Zaborski * Allow: 1064d3bfc725SMariusz Zaborski * fields: gr_name, gr_passwd 1065d3bfc725SMariusz Zaborski */ 1066d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1067d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1068d3bfc725SMariusz Zaborski 1069d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1070d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1071d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0); 1072d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1073d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1074d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1075d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1076d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1077d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1078d3bfc725SMariusz Zaborski fields[0] = "gr_gid"; 1079d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1080d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1081d3bfc725SMariusz Zaborski 1082d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD)); 1083d3bfc725SMariusz Zaborski 1084d3bfc725SMariusz Zaborski cap_close(capgrp); 1085d3bfc725SMariusz Zaborski 1086d3bfc725SMariusz Zaborski /* 1087d3bfc725SMariusz Zaborski * Allow: 1088d3bfc725SMariusz Zaborski * fields: gr_name, gr_gid 1089d3bfc725SMariusz Zaborski */ 1090d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1091d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1092d3bfc725SMariusz Zaborski 1093d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1094d3bfc725SMariusz Zaborski fields[1] = "gr_gid"; 1095d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0); 1096d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1097d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1098d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1099d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1100d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1101d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1102d3bfc725SMariusz Zaborski fields[0] = "gr_mem"; 1103d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1104d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1105d3bfc725SMariusz Zaborski 1106d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_GID)); 1107d3bfc725SMariusz Zaborski 1108d3bfc725SMariusz Zaborski cap_close(capgrp); 1109d3bfc725SMariusz Zaborski 1110d3bfc725SMariusz Zaborski /* 1111d3bfc725SMariusz Zaborski * Allow: 1112d3bfc725SMariusz Zaborski * fields: gr_name, gr_mem 1113d3bfc725SMariusz Zaborski */ 1114d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1115d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1116d3bfc725SMariusz Zaborski 1117d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1118d3bfc725SMariusz Zaborski fields[1] = "gr_mem"; 1119d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0); 1120d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1121d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1122d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1123d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1124d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1125d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1126d3bfc725SMariusz Zaborski fields[0] = "gr_passwd"; 1127d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1128d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1129d3bfc725SMariusz Zaborski 1130d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_NAME | GR_MEM)); 1131d3bfc725SMariusz Zaborski 1132d3bfc725SMariusz Zaborski cap_close(capgrp); 1133d3bfc725SMariusz Zaborski 1134d3bfc725SMariusz Zaborski /* 1135d3bfc725SMariusz Zaborski * Allow: 1136d3bfc725SMariusz Zaborski * fields: gr_passwd, gr_gid 1137d3bfc725SMariusz Zaborski */ 1138d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1139d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1140d3bfc725SMariusz Zaborski 1141d3bfc725SMariusz Zaborski fields[0] = "gr_passwd"; 1142d3bfc725SMariusz Zaborski fields[1] = "gr_gid"; 1143d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0); 1144d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1145d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1146d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1147d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1148d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1149d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1150d3bfc725SMariusz Zaborski fields[0] = "gr_mem"; 1151d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1152d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1153d3bfc725SMariusz Zaborski 1154d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID)); 1155d3bfc725SMariusz Zaborski 1156d3bfc725SMariusz Zaborski cap_close(capgrp); 1157d3bfc725SMariusz Zaborski 1158d3bfc725SMariusz Zaborski /* 1159d3bfc725SMariusz Zaborski * Allow: 1160d3bfc725SMariusz Zaborski * fields: gr_passwd, gr_mem 1161d3bfc725SMariusz Zaborski */ 1162d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1163d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1164d3bfc725SMariusz Zaborski 1165d3bfc725SMariusz Zaborski fields[0] = "gr_passwd"; 1166d3bfc725SMariusz Zaborski fields[1] = "gr_mem"; 1167d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0); 1168d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1169d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1170d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1171d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1172d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1173d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1174d3bfc725SMariusz Zaborski fields[0] = "gr_gid"; 1175d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1176d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1177d3bfc725SMariusz Zaborski 1178d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_PASSWD | GR_MEM)); 1179d3bfc725SMariusz Zaborski 1180d3bfc725SMariusz Zaborski cap_close(capgrp); 1181d3bfc725SMariusz Zaborski 1182d3bfc725SMariusz Zaborski /* 1183d3bfc725SMariusz Zaborski * Allow: 1184d3bfc725SMariusz Zaborski * fields: gr_gid, gr_mem 1185d3bfc725SMariusz Zaborski */ 1186d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1187d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1188d3bfc725SMariusz Zaborski 1189d3bfc725SMariusz Zaborski fields[0] = "gr_gid"; 1190d3bfc725SMariusz Zaborski fields[1] = "gr_mem"; 1191d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0); 1192d3bfc725SMariusz Zaborski fields[0] = "gr_name"; 1193d3bfc725SMariusz Zaborski fields[1] = "gr_passwd"; 1194d3bfc725SMariusz Zaborski fields[2] = "gr_gid"; 1195d3bfc725SMariusz Zaborski fields[3] = "gr_mem"; 1196d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 && 1197d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1198d3bfc725SMariusz Zaborski fields[0] = "gr_passwd"; 1199d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 && 1200d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1201d3bfc725SMariusz Zaborski 1202d3bfc725SMariusz Zaborski CHECK(runtest_fields(capgrp, GR_GID | GR_MEM)); 1203d3bfc725SMariusz Zaborski 1204d3bfc725SMariusz Zaborski cap_close(capgrp); 1205d3bfc725SMariusz Zaborski } 1206d3bfc725SMariusz Zaborski 1207d3bfc725SMariusz Zaborski static bool 1208d3bfc725SMariusz Zaborski runtest_groups(cap_channel_t *capgrp, const char **names, const gid_t *gids, 1209d3bfc725SMariusz Zaborski size_t ngroups) 1210d3bfc725SMariusz Zaborski { 1211d3bfc725SMariusz Zaborski char buf[1024]; 1212d3bfc725SMariusz Zaborski struct group *grp; 1213d3bfc725SMariusz Zaborski struct group st; 1214d3bfc725SMariusz Zaborski unsigned int i, got; 1215d3bfc725SMariusz Zaborski 1216d3bfc725SMariusz Zaborski (void)cap_setgrent(capgrp); 1217d3bfc725SMariusz Zaborski got = 0; 1218d3bfc725SMariusz Zaborski for (;;) { 1219d3bfc725SMariusz Zaborski grp = cap_getgrent(capgrp); 1220d3bfc725SMariusz Zaborski if (grp == NULL) 1221d3bfc725SMariusz Zaborski break; 1222d3bfc725SMariusz Zaborski got++; 1223d3bfc725SMariusz Zaborski for (i = 0; i < ngroups; i++) { 1224d3bfc725SMariusz Zaborski if (strcmp(names[i], grp->gr_name) == 0 && 1225d3bfc725SMariusz Zaborski gids[i] == grp->gr_gid) { 1226d3bfc725SMariusz Zaborski break; 1227d3bfc725SMariusz Zaborski } 1228d3bfc725SMariusz Zaborski } 1229d3bfc725SMariusz Zaborski if (i == ngroups) 1230d3bfc725SMariusz Zaborski return (false); 1231d3bfc725SMariusz Zaborski } 1232d3bfc725SMariusz Zaborski if (got != ngroups) 1233d3bfc725SMariusz Zaborski return (false); 1234d3bfc725SMariusz Zaborski 1235d3bfc725SMariusz Zaborski (void)cap_setgrent(capgrp); 1236d3bfc725SMariusz Zaborski got = 0; 1237d3bfc725SMariusz Zaborski for (;;) { 1238d3bfc725SMariusz Zaborski cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp); 1239d3bfc725SMariusz Zaborski if (grp == NULL) 1240d3bfc725SMariusz Zaborski break; 1241d3bfc725SMariusz Zaborski got++; 1242d3bfc725SMariusz Zaborski for (i = 0; i < ngroups; i++) { 1243d3bfc725SMariusz Zaborski if (strcmp(names[i], grp->gr_name) == 0 && 1244d3bfc725SMariusz Zaborski gids[i] == grp->gr_gid) { 1245d3bfc725SMariusz Zaborski break; 1246d3bfc725SMariusz Zaborski } 1247d3bfc725SMariusz Zaborski } 1248d3bfc725SMariusz Zaborski if (i == ngroups) 1249d3bfc725SMariusz Zaborski return (false); 1250d3bfc725SMariusz Zaborski } 1251d3bfc725SMariusz Zaborski if (got != ngroups) 1252d3bfc725SMariusz Zaborski return (false); 1253d3bfc725SMariusz Zaborski 1254d3bfc725SMariusz Zaborski for (i = 0; i < ngroups; i++) { 1255d3bfc725SMariusz Zaborski grp = cap_getgrnam(capgrp, names[i]); 1256d3bfc725SMariusz Zaborski if (grp == NULL) 1257d3bfc725SMariusz Zaborski return (false); 1258d3bfc725SMariusz Zaborski } 1259d3bfc725SMariusz Zaborski 1260d3bfc725SMariusz Zaborski for (i = 0; i < ngroups; i++) { 1261d3bfc725SMariusz Zaborski cap_getgrnam_r(capgrp, names[i], &st, buf, sizeof(buf), &grp); 1262d3bfc725SMariusz Zaborski if (grp == NULL) 1263d3bfc725SMariusz Zaborski return (false); 1264d3bfc725SMariusz Zaborski } 1265d3bfc725SMariusz Zaborski 1266d3bfc725SMariusz Zaborski for (i = 0; i < ngroups; i++) { 1267d3bfc725SMariusz Zaborski grp = cap_getgrgid(capgrp, gids[i]); 1268d3bfc725SMariusz Zaborski if (grp == NULL) 1269d3bfc725SMariusz Zaborski return (false); 1270d3bfc725SMariusz Zaborski } 1271d3bfc725SMariusz Zaborski 1272d3bfc725SMariusz Zaborski for (i = 0; i < ngroups; i++) { 1273d3bfc725SMariusz Zaborski cap_getgrgid_r(capgrp, gids[i], &st, buf, sizeof(buf), &grp); 1274d3bfc725SMariusz Zaborski if (grp == NULL) 1275d3bfc725SMariusz Zaborski return (false); 1276d3bfc725SMariusz Zaborski } 1277d3bfc725SMariusz Zaborski 1278d3bfc725SMariusz Zaborski return (true); 1279d3bfc725SMariusz Zaborski } 1280d3bfc725SMariusz Zaborski 1281d3bfc725SMariusz Zaborski static void 1282d3bfc725SMariusz Zaborski test_groups(cap_channel_t *origcapgrp) 1283d3bfc725SMariusz Zaborski { 1284d3bfc725SMariusz Zaborski cap_channel_t *capgrp; 1285d3bfc725SMariusz Zaborski const char *names[5]; 1286d3bfc725SMariusz Zaborski gid_t gids[5]; 1287d3bfc725SMariusz Zaborski 1288d3bfc725SMariusz Zaborski /* 1289d3bfc725SMariusz Zaborski * Allow: 1290d3bfc725SMariusz Zaborski * groups: 1291d3bfc725SMariusz Zaborski * names: wheel, daemon, kmem, sys, tty 1292d3bfc725SMariusz Zaborski * gids: 1293d3bfc725SMariusz Zaborski */ 1294d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1295d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1296d3bfc725SMariusz Zaborski 1297d3bfc725SMariusz Zaborski names[0] = "wheel"; 1298d3bfc725SMariusz Zaborski names[1] = "daemon"; 1299d3bfc725SMariusz Zaborski names[2] = "kmem"; 1300d3bfc725SMariusz Zaborski names[3] = "sys"; 1301d3bfc725SMariusz Zaborski names[4] = "tty"; 1302d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0); 1303d3bfc725SMariusz Zaborski gids[0] = 0; 1304d3bfc725SMariusz Zaborski gids[1] = 1; 1305d3bfc725SMariusz Zaborski gids[2] = 2; 1306d3bfc725SMariusz Zaborski gids[3] = 3; 1307d3bfc725SMariusz Zaborski gids[4] = 4; 1308d3bfc725SMariusz Zaborski 1309d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 5)); 1310d3bfc725SMariusz Zaborski 1311d3bfc725SMariusz Zaborski cap_close(capgrp); 1312d3bfc725SMariusz Zaborski 1313d3bfc725SMariusz Zaborski /* 1314d3bfc725SMariusz Zaborski * Allow: 1315d3bfc725SMariusz Zaborski * groups: 1316d3bfc725SMariusz Zaborski * names: kmem, sys, tty 1317d3bfc725SMariusz Zaborski * gids: 1318d3bfc725SMariusz Zaborski */ 1319d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1320d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1321d3bfc725SMariusz Zaborski 1322d3bfc725SMariusz Zaborski names[0] = "kmem"; 1323d3bfc725SMariusz Zaborski names[1] = "sys"; 1324d3bfc725SMariusz Zaborski names[2] = "tty"; 1325d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0); 1326d3bfc725SMariusz Zaborski names[3] = "daemon"; 1327d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 && 1328d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1329d3bfc725SMariusz Zaborski names[0] = "daemon"; 1330d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 && 1331d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1332d3bfc725SMariusz Zaborski names[0] = "kmem"; 1333d3bfc725SMariusz Zaborski gids[0] = 2; 1334d3bfc725SMariusz Zaborski gids[1] = 3; 1335d3bfc725SMariusz Zaborski gids[2] = 4; 1336d3bfc725SMariusz Zaborski 1337d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 3)); 1338d3bfc725SMariusz Zaborski 1339d3bfc725SMariusz Zaborski cap_close(capgrp); 1340d3bfc725SMariusz Zaborski 1341d3bfc725SMariusz Zaborski /* 1342d3bfc725SMariusz Zaborski * Allow: 1343d3bfc725SMariusz Zaborski * groups: 1344d3bfc725SMariusz Zaborski * names: wheel, kmem, tty 1345d3bfc725SMariusz Zaborski * gids: 1346d3bfc725SMariusz Zaborski */ 1347d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1348d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1349d3bfc725SMariusz Zaborski 1350d3bfc725SMariusz Zaborski names[0] = "wheel"; 1351d3bfc725SMariusz Zaborski names[1] = "kmem"; 1352d3bfc725SMariusz Zaborski names[2] = "tty"; 1353d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0); 1354d3bfc725SMariusz Zaborski names[3] = "daemon"; 1355d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 && 1356d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1357d3bfc725SMariusz Zaborski names[0] = "daemon"; 1358d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 && 1359d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1360d3bfc725SMariusz Zaborski names[0] = "wheel"; 1361d3bfc725SMariusz Zaborski gids[0] = 0; 1362d3bfc725SMariusz Zaborski gids[1] = 2; 1363d3bfc725SMariusz Zaborski gids[2] = 4; 1364d3bfc725SMariusz Zaborski 1365d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 3)); 1366d3bfc725SMariusz Zaborski 1367d3bfc725SMariusz Zaborski cap_close(capgrp); 1368d3bfc725SMariusz Zaborski 1369d3bfc725SMariusz Zaborski /* 1370d3bfc725SMariusz Zaborski * Allow: 1371d3bfc725SMariusz Zaborski * groups: 1372d3bfc725SMariusz Zaborski * names: 1373d3bfc725SMariusz Zaborski * gids: 2, 3, 4 1374d3bfc725SMariusz Zaborski */ 1375d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1376d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1377d3bfc725SMariusz Zaborski 1378d3bfc725SMariusz Zaborski names[0] = "kmem"; 1379d3bfc725SMariusz Zaborski names[1] = "sys"; 1380d3bfc725SMariusz Zaborski names[2] = "tty"; 1381d3bfc725SMariusz Zaborski gids[0] = 2; 1382d3bfc725SMariusz Zaborski gids[1] = 3; 1383d3bfc725SMariusz Zaborski gids[2] = 4; 1384d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0); 1385d3bfc725SMariusz Zaborski gids[3] = 0; 1386d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 && 1387d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1388d3bfc725SMariusz Zaborski gids[0] = 0; 1389d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 && 1390d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1391d3bfc725SMariusz Zaborski gids[0] = 2; 1392d3bfc725SMariusz Zaborski 1393d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 3)); 1394d3bfc725SMariusz Zaborski 1395d3bfc725SMariusz Zaborski cap_close(capgrp); 1396d3bfc725SMariusz Zaborski 1397d3bfc725SMariusz Zaborski /* 1398d3bfc725SMariusz Zaborski * Allow: 1399d3bfc725SMariusz Zaborski * groups: 1400d3bfc725SMariusz Zaborski * names: 1401d3bfc725SMariusz Zaborski * gids: 0, 2, 4 1402d3bfc725SMariusz Zaborski */ 1403d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1404d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1405d3bfc725SMariusz Zaborski 1406d3bfc725SMariusz Zaborski names[0] = "wheel"; 1407d3bfc725SMariusz Zaborski names[1] = "kmem"; 1408d3bfc725SMariusz Zaborski names[2] = "tty"; 1409d3bfc725SMariusz Zaborski gids[0] = 0; 1410d3bfc725SMariusz Zaborski gids[1] = 2; 1411d3bfc725SMariusz Zaborski gids[2] = 4; 1412d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0); 1413d3bfc725SMariusz Zaborski gids[3] = 1; 1414d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 && 1415d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1416d3bfc725SMariusz Zaborski gids[0] = 1; 1417d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 && 1418d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1419d3bfc725SMariusz Zaborski gids[0] = 0; 1420d3bfc725SMariusz Zaborski 1421d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 3)); 1422d3bfc725SMariusz Zaborski 1423d3bfc725SMariusz Zaborski cap_close(capgrp); 1424d3bfc725SMariusz Zaborski 1425d3bfc725SMariusz Zaborski /* 1426d3bfc725SMariusz Zaborski * Allow: 1427d3bfc725SMariusz Zaborski * groups: 1428d3bfc725SMariusz Zaborski * names: kmem 1429d3bfc725SMariusz Zaborski * gids: 1430d3bfc725SMariusz Zaborski */ 1431d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1432d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1433d3bfc725SMariusz Zaborski 1434d3bfc725SMariusz Zaborski names[0] = "kmem"; 1435d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == 0); 1436d3bfc725SMariusz Zaborski names[1] = "daemon"; 1437d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == -1 && 1438d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1439d3bfc725SMariusz Zaborski names[0] = "daemon"; 1440d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 && 1441d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1442d3bfc725SMariusz Zaborski names[0] = "kmem"; 1443d3bfc725SMariusz Zaborski gids[0] = 2; 1444d3bfc725SMariusz Zaborski 1445d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 1)); 1446d3bfc725SMariusz Zaborski 1447d3bfc725SMariusz Zaborski cap_close(capgrp); 1448d3bfc725SMariusz Zaborski 1449d3bfc725SMariusz Zaborski /* 1450d3bfc725SMariusz Zaborski * Allow: 1451d3bfc725SMariusz Zaborski * groups: 1452d3bfc725SMariusz Zaborski * names: wheel, tty 1453d3bfc725SMariusz Zaborski * gids: 1454d3bfc725SMariusz Zaborski */ 1455d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1456d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1457d3bfc725SMariusz Zaborski 1458d3bfc725SMariusz Zaborski names[0] = "wheel"; 1459d3bfc725SMariusz Zaborski names[1] = "tty"; 1460d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == 0); 1461d3bfc725SMariusz Zaborski names[2] = "daemon"; 1462d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == -1 && 1463d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1464d3bfc725SMariusz Zaborski names[0] = "daemon"; 1465d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 && 1466d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1467d3bfc725SMariusz Zaborski names[0] = "wheel"; 1468d3bfc725SMariusz Zaborski gids[0] = 0; 1469d3bfc725SMariusz Zaborski gids[1] = 4; 1470d3bfc725SMariusz Zaborski 1471d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 2)); 1472d3bfc725SMariusz Zaborski 1473d3bfc725SMariusz Zaborski cap_close(capgrp); 1474d3bfc725SMariusz Zaborski 1475d3bfc725SMariusz Zaborski /* 1476d3bfc725SMariusz Zaborski * Allow: 1477d3bfc725SMariusz Zaborski * groups: 1478d3bfc725SMariusz Zaborski * names: 1479d3bfc725SMariusz Zaborski * gids: 2 1480d3bfc725SMariusz Zaborski */ 1481d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1482d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1483d3bfc725SMariusz Zaborski 1484d3bfc725SMariusz Zaborski names[0] = "kmem"; 1485d3bfc725SMariusz Zaborski gids[0] = 2; 1486d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == 0); 1487d3bfc725SMariusz Zaborski gids[1] = 1; 1488d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == -1 && 1489d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1490d3bfc725SMariusz Zaborski gids[0] = 1; 1491d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 && 1492d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1493d3bfc725SMariusz Zaborski gids[0] = 2; 1494d3bfc725SMariusz Zaborski 1495d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 1)); 1496d3bfc725SMariusz Zaborski 1497d3bfc725SMariusz Zaborski cap_close(capgrp); 1498d3bfc725SMariusz Zaborski 1499d3bfc725SMariusz Zaborski /* 1500d3bfc725SMariusz Zaborski * Allow: 1501d3bfc725SMariusz Zaborski * groups: 1502d3bfc725SMariusz Zaborski * names: 1503d3bfc725SMariusz Zaborski * gids: 0, 4 1504d3bfc725SMariusz Zaborski */ 1505d3bfc725SMariusz Zaborski capgrp = cap_clone(origcapgrp); 1506d3bfc725SMariusz Zaborski CHECK(capgrp != NULL); 1507d3bfc725SMariusz Zaborski 1508d3bfc725SMariusz Zaborski names[0] = "wheel"; 1509d3bfc725SMariusz Zaborski names[1] = "tty"; 1510d3bfc725SMariusz Zaborski gids[0] = 0; 1511d3bfc725SMariusz Zaborski gids[1] = 4; 1512d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == 0); 1513d3bfc725SMariusz Zaborski gids[2] = 1; 1514d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == -1 && 1515d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1516d3bfc725SMariusz Zaborski gids[0] = 1; 1517d3bfc725SMariusz Zaborski CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 && 1518d3bfc725SMariusz Zaborski errno == ENOTCAPABLE); 1519d3bfc725SMariusz Zaborski gids[0] = 0; 1520d3bfc725SMariusz Zaborski 1521d3bfc725SMariusz Zaborski CHECK(runtest_groups(capgrp, names, gids, 2)); 1522d3bfc725SMariusz Zaborski 1523d3bfc725SMariusz Zaborski cap_close(capgrp); 1524d3bfc725SMariusz Zaborski } 1525d3bfc725SMariusz Zaborski 1526d3bfc725SMariusz Zaborski int 1527d3bfc725SMariusz Zaborski main(void) 1528d3bfc725SMariusz Zaborski { 1529d3bfc725SMariusz Zaborski cap_channel_t *capcas, *capgrp; 1530d3bfc725SMariusz Zaborski 1531d3bfc725SMariusz Zaborski printf("1..199\n"); 1532ebe3e93cSEnji Cooper fflush(stdout); 1533d3bfc725SMariusz Zaborski 1534d3bfc725SMariusz Zaborski capcas = cap_init(); 1535d3bfc725SMariusz Zaborski CHECKX(capcas != NULL); 1536d3bfc725SMariusz Zaborski 1537d3bfc725SMariusz Zaborski capgrp = cap_service_open(capcas, "system.grp"); 1538d3bfc725SMariusz Zaborski CHECKX(capgrp != NULL); 1539d3bfc725SMariusz Zaborski 1540d3bfc725SMariusz Zaborski cap_close(capcas); 1541d3bfc725SMariusz Zaborski 1542d3bfc725SMariusz Zaborski /* No limits. */ 1543d3bfc725SMariusz Zaborski 1544d3bfc725SMariusz Zaborski CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R | 1545d3bfc725SMariusz Zaborski GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R)); 1546d3bfc725SMariusz Zaborski 1547d3bfc725SMariusz Zaborski test_cmds(capgrp); 1548d3bfc725SMariusz Zaborski 1549d3bfc725SMariusz Zaborski test_fields(capgrp); 1550d3bfc725SMariusz Zaborski 1551d3bfc725SMariusz Zaborski test_groups(capgrp); 1552d3bfc725SMariusz Zaborski 1553d3bfc725SMariusz Zaborski cap_close(capgrp); 1554d3bfc725SMariusz Zaborski 1555d3bfc725SMariusz Zaborski exit(0); 1556d3bfc725SMariusz Zaborski } 1557