Path: blob/main/lib/libcasper/services/cap_grp/tests/grp_test.c
48383 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2013 The FreeBSD Foundation4*5* This software was developed by Pawel Jakub Dawidek under sponsorship from6* the FreeBSD Foundation.7*8* Redistribution and use in source and binary forms, with or without9* modification, are permitted provided that the following conditions10* are met:11* 1. Redistributions of source code must retain the above copyright12* notice, this list of conditions and the following disclaimer.13* 2. Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in the15* documentation and/or other materials provided with the distribution.16*17* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND18* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE19* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE20* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE21* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT25* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY26* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF27* SUCH DAMAGE.28*/2930#include <sys/capsicum.h>31#include <sys/nv.h>3233#include <assert.h>34#include <err.h>35#include <errno.h>36#include <grp.h>37#include <stdio.h>38#include <stdlib.h>39#include <string.h>40#include <unistd.h>4142#include <libcasper.h>4344#include <casper/cap_grp.h>4546static int ntest = 1;4748#define CHECK(expr) do { \49if ((expr)) \50printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \51else \52printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \53fflush(stdout); \54ntest++; \55} while (0)56#define CHECKX(expr) do { \57if ((expr)) { \58printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \59} else { \60printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \61exit(1); \62} \63fflush(stdout); \64ntest++; \65} while (0)6667#define GID_WHEEL 068#define GID_OPERATOR 56970#define GETGRENT0 0x000171#define GETGRENT1 0x000272#define GETGRENT2 0x000473#define GETGRENT (GETGRENT0 | GETGRENT1 | GETGRENT2)74#define GETGRENT_R0 0x000875#define GETGRENT_R1 0x001076#define GETGRENT_R2 0x002077#define GETGRENT_R (GETGRENT_R0 | GETGRENT_R1 | GETGRENT_R2)78#define GETGRNAM 0x004079#define GETGRNAM_R 0x008080#define GETGRGID 0x010081#define GETGRGID_R 0x020082#define SETGRENT 0x04008384static bool85group_mem_compare(char **mem0, char **mem1)86{87int i0, i1;8889if (mem0 == NULL && mem1 == NULL)90return (true);91if (mem0 == NULL || mem1 == NULL)92return (false);9394for (i0 = 0; mem0[i0] != NULL; i0++) {95for (i1 = 0; mem1[i1] != NULL; i1++) {96if (strcmp(mem0[i0], mem1[i1]) == 0)97break;98}99if (mem1[i1] == NULL)100return (false);101}102103return (true);104}105106static bool107group_compare(const struct group *grp0, const struct group *grp1)108{109110if (grp0 == NULL && grp1 == NULL)111return (true);112if (grp0 == NULL || grp1 == NULL)113return (false);114115if (strcmp(grp0->gr_name, grp1->gr_name) != 0)116return (false);117118if (grp0->gr_passwd != NULL || grp1->gr_passwd != NULL) {119if (grp0->gr_passwd == NULL || grp1->gr_passwd == NULL)120return (false);121if (strcmp(grp0->gr_passwd, grp1->gr_passwd) != 0)122return (false);123}124125if (grp0->gr_gid != grp1->gr_gid)126return (false);127128if (!group_mem_compare(grp0->gr_mem, grp1->gr_mem))129return (false);130131return (true);132}133134static unsigned int135runtest_cmds(cap_channel_t *capgrp)136{137char bufs[1024], bufc[1024];138unsigned int result;139struct group *grps, *grpc;140struct group sts, stc;141142result = 0;143144(void)setgrent();145if (cap_setgrent(capgrp) == 1)146result |= SETGRENT;147148grps = getgrent();149grpc = cap_getgrent(capgrp);150if (group_compare(grps, grpc)) {151result |= GETGRENT0;152grps = getgrent();153grpc = cap_getgrent(capgrp);154if (group_compare(grps, grpc))155result |= GETGRENT1;156}157158getgrent_r(&sts, bufs, sizeof(bufs), &grps);159cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);160if (group_compare(grps, grpc)) {161result |= GETGRENT_R0;162getgrent_r(&sts, bufs, sizeof(bufs), &grps);163cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);164if (group_compare(grps, grpc))165result |= GETGRENT_R1;166}167168(void)setgrent();169if (cap_setgrent(capgrp) == 1)170result |= SETGRENT;171172getgrent_r(&sts, bufs, sizeof(bufs), &grps);173cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);174if (group_compare(grps, grpc))175result |= GETGRENT_R2;176177grps = getgrent();178grpc = cap_getgrent(capgrp);179if (group_compare(grps, grpc))180result |= GETGRENT2;181182grps = getgrnam("wheel");183grpc = cap_getgrnam(capgrp, "wheel");184if (group_compare(grps, grpc)) {185grps = getgrnam("operator");186grpc = cap_getgrnam(capgrp, "operator");187if (group_compare(grps, grpc))188result |= GETGRNAM;189}190191getgrnam_r("wheel", &sts, bufs, sizeof(bufs), &grps);192cap_getgrnam_r(capgrp, "wheel", &stc, bufc, sizeof(bufc), &grpc);193if (group_compare(grps, grpc)) {194getgrnam_r("operator", &sts, bufs, sizeof(bufs), &grps);195cap_getgrnam_r(capgrp, "operator", &stc, bufc, sizeof(bufc),196&grpc);197if (group_compare(grps, grpc))198result |= GETGRNAM_R;199}200201grps = getgrgid(GID_WHEEL);202grpc = cap_getgrgid(capgrp, GID_WHEEL);203if (group_compare(grps, grpc)) {204grps = getgrgid(GID_OPERATOR);205grpc = cap_getgrgid(capgrp, GID_OPERATOR);206if (group_compare(grps, grpc))207result |= GETGRGID;208}209210getgrgid_r(GID_WHEEL, &sts, bufs, sizeof(bufs), &grps);211cap_getgrgid_r(capgrp, GID_WHEEL, &stc, bufc, sizeof(bufc), &grpc);212if (group_compare(grps, grpc)) {213getgrgid_r(GID_OPERATOR, &sts, bufs, sizeof(bufs), &grps);214cap_getgrgid_r(capgrp, GID_OPERATOR, &stc, bufc, sizeof(bufc),215&grpc);216if (group_compare(grps, grpc))217result |= GETGRGID_R;218}219220return (result);221}222223static void224test_cmds(cap_channel_t *origcapgrp)225{226cap_channel_t *capgrp;227const char *cmds[7], *fields[4], *names[5];228gid_t gids[5];229230fields[0] = "gr_name";231fields[1] = "gr_passwd";232fields[2] = "gr_gid";233fields[3] = "gr_mem";234235names[0] = "wheel";236names[1] = "daemon";237names[2] = "kmem";238names[3] = "sys";239names[4] = "operator";240241gids[0] = 0;242gids[1] = 1;243gids[2] = 2;244gids[3] = 3;245gids[4] = 5;246247/*248* Allow:249* cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,250* getgrgid, getgrgid_r251* fields: gr_name, gr_passwd, gr_gid, gr_mem252* groups:253* names: wheel, daemon, kmem, sys, operator254* gids:255*/256capgrp = cap_clone(origcapgrp);257CHECK(capgrp != NULL);258259cmds[0] = "setgrent";260cmds[1] = "getgrent";261cmds[2] = "getgrent_r";262cmds[3] = "getgrnam";263cmds[4] = "getgrnam_r";264cmds[5] = "getgrgid";265cmds[6] = "getgrgid_r";266CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);267CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);268CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);269270CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |271GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));272273cap_close(capgrp);274275/*276* Allow:277* cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,278* getgrgid, getgrgid_r279* fields: gr_name, gr_passwd, gr_gid, gr_mem280* groups:281* names:282* gids: 0, 1, 2, 3, 5283*/284capgrp = cap_clone(origcapgrp);285CHECK(capgrp != NULL);286287cmds[0] = "setgrent";288cmds[1] = "getgrent";289cmds[2] = "getgrent_r";290cmds[3] = "getgrnam";291cmds[4] = "getgrnam_r";292cmds[5] = "getgrgid";293cmds[6] = "getgrgid_r";294CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);295CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);296CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);297298CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |299GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));300301cap_close(capgrp);302303/*304* Allow:305* cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,306* getgrgid, getgrgid_r307* fields: gr_name, gr_passwd, gr_gid, gr_mem308* groups:309* names: wheel, daemon, kmem, sys, operator310* gids:311* Disallow:312* cmds: setgrent313* fields:314* groups:315*/316capgrp = cap_clone(origcapgrp);317CHECK(capgrp != NULL);318319cap_setgrent(capgrp);320321cmds[0] = "getgrent";322cmds[1] = "getgrent_r";323cmds[2] = "getgrnam";324cmds[3] = "getgrnam_r";325cmds[4] = "getgrgid";326cmds[5] = "getgrgid_r";327CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);328cmds[0] = "setgrent";329cmds[1] = "getgrent";330cmds[2] = "getgrent_r";331cmds[3] = "getgrnam";332cmds[4] = "getgrnam_r";333cmds[5] = "getgrgid";334cmds[6] = "getgrgid_r";335CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);336cmds[0] = "setgrent";337CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);338CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);339340CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |341GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));342343cap_close(capgrp);344345/*346* Allow:347* cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,348* getgrgid, getgrgid_r349* fields: gr_name, gr_passwd, gr_gid, gr_mem350* groups:351* names:352* gids: 0, 1, 2, 3, 5353* Disallow:354* cmds: setgrent355* fields:356* groups:357*/358capgrp = cap_clone(origcapgrp);359CHECK(capgrp != NULL);360361cap_setgrent(capgrp);362363cmds[0] = "getgrent";364cmds[1] = "getgrent_r";365cmds[2] = "getgrnam";366cmds[3] = "getgrnam_r";367cmds[4] = "getgrgid";368cmds[5] = "getgrgid_r";369CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);370cmds[0] = "setgrent";371cmds[1] = "getgrent";372cmds[2] = "getgrent_r";373cmds[3] = "getgrnam";374cmds[4] = "getgrnam_r";375cmds[5] = "getgrgid";376cmds[6] = "getgrgid_r";377CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);378cmds[0] = "setgrent";379CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);380CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);381382CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |383GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));384385cap_close(capgrp);386387/*388* Allow:389* cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,390* getgrgid, getgrgid_r391* fields: gr_name, gr_passwd, gr_gid, gr_mem392* groups:393* names: wheel, daemon, kmem, sys, operator394* gids:395* Disallow:396* cmds: getgrent397* fields:398* groups:399*/400capgrp = cap_clone(origcapgrp);401CHECK(capgrp != NULL);402403cmds[0] = "setgrent";404cmds[1] = "getgrent_r";405cmds[2] = "getgrnam";406cmds[3] = "getgrnam_r";407cmds[4] = "getgrgid";408cmds[5] = "getgrgid_r";409CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);410cmds[0] = "setgrent";411cmds[1] = "getgrent";412cmds[2] = "getgrent_r";413cmds[3] = "getgrnam";414cmds[4] = "getgrnam_r";415cmds[5] = "getgrgid";416cmds[6] = "getgrgid_r";417CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);418cmds[0] = "getgrent";419CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);420CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);421CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);422423CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |424GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));425426cap_close(capgrp);427428/*429* Allow:430* cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,431* getgrgid, getgrgid_r432* fields: gr_name, gr_passwd, gr_gid, gr_mem433* groups:434* names:435* gids: 0, 1, 2, 3, 5436* Disallow:437* cmds: getgrent438* fields:439* groups:440*/441capgrp = cap_clone(origcapgrp);442CHECK(capgrp != NULL);443444cmds[0] = "setgrent";445cmds[1] = "getgrent_r";446cmds[2] = "getgrnam";447cmds[3] = "getgrnam_r";448cmds[4] = "getgrgid";449cmds[5] = "getgrgid_r";450CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);451cmds[0] = "setgrent";452cmds[1] = "getgrent";453cmds[2] = "getgrent_r";454cmds[3] = "getgrnam";455cmds[4] = "getgrnam_r";456cmds[5] = "getgrgid";457cmds[6] = "getgrgid_r";458CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);459cmds[0] = "getgrent";460CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);461CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);462CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);463464CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |465GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));466467cap_close(capgrp);468469/*470* Allow:471* cmds: setgrent, getgrent, getgrnam, getgrnam_r,472* getgrgid, getgrgid_r473* fields: gr_name, gr_passwd, gr_gid, gr_mem474* groups:475* names: wheel, daemon, kmem, sys, operator476* gids:477* Disallow:478* cmds: getgrent_r479* fields:480* groups:481*/482capgrp = cap_clone(origcapgrp);483CHECK(capgrp != NULL);484485cmds[0] = "setgrent";486cmds[1] = "getgrent";487cmds[2] = "getgrnam";488cmds[3] = "getgrnam_r";489cmds[4] = "getgrgid";490cmds[5] = "getgrgid_r";491CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);492cmds[0] = "setgrent";493cmds[1] = "getgrent";494cmds[2] = "getgrent_r";495cmds[3] = "getgrnam";496cmds[4] = "getgrnam_r";497cmds[5] = "getgrgid";498cmds[6] = "getgrgid_r";499CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);500cmds[0] = "getgrent_r";501CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);502CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);503504CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |505GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));506507cap_close(capgrp);508509/*510* Allow:511* cmds: setgrent, getgrent, getgrnam, getgrnam_r,512* getgrgid, getgrgid_r513* fields: gr_name, gr_passwd, gr_gid, gr_mem514* groups:515* names:516* gids: 0, 1, 2, 3, 5517* Disallow:518* cmds: getgrent_r519* fields:520* groups:521*/522capgrp = cap_clone(origcapgrp);523CHECK(capgrp != NULL);524525cmds[0] = "setgrent";526cmds[1] = "getgrent";527cmds[2] = "getgrnam";528cmds[3] = "getgrnam_r";529cmds[4] = "getgrgid";530cmds[5] = "getgrgid_r";531CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);532cmds[0] = "setgrent";533cmds[1] = "getgrent";534cmds[2] = "getgrent_r";535cmds[3] = "getgrnam";536cmds[4] = "getgrnam_r";537cmds[5] = "getgrgid";538cmds[6] = "getgrgid_r";539CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);540cmds[0] = "getgrent_r";541CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);542CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);543544CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |545GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));546547cap_close(capgrp);548549/*550* Allow:551* cmds: setgrent, getgrent, getgrent_r, getgrnam_r,552* getgrgid, getgrgid_r553* fields: gr_name, gr_passwd, gr_gid, gr_mem554* groups:555* names: wheel, daemon, kmem, sys, operator556* gids:557* Disallow:558* cmds: getgrnam559* fields:560* groups:561*/562capgrp = cap_clone(origcapgrp);563CHECK(capgrp != NULL);564565cmds[0] = "setgrent";566cmds[1] = "getgrent";567cmds[2] = "getgrent_r";568cmds[3] = "getgrnam_r";569cmds[4] = "getgrgid";570cmds[5] = "getgrgid_r";571CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);572cmds[0] = "setgrent";573cmds[1] = "getgrent";574cmds[2] = "getgrent_r";575cmds[3] = "getgrnam";576cmds[4] = "getgrnam_r";577cmds[5] = "getgrgid";578cmds[6] = "getgrgid_r";579CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);580cmds[0] = "getgrnam";581CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);582CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);583CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);584585CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |586GETGRNAM_R | GETGRGID | GETGRGID_R));587588cap_close(capgrp);589590/*591* Allow:592* cmds: setgrent, getgrent, getgrent_r, getgrnam_r,593* getgrgid, getgrgid_r594* fields: gr_name, gr_passwd, gr_gid, gr_mem595* groups:596* names:597* gids: 0, 1, 2, 3, 5598* Disallow:599* cmds: getgrnam600* fields:601* groups:602*/603capgrp = cap_clone(origcapgrp);604CHECK(capgrp != NULL);605606cmds[0] = "setgrent";607cmds[1] = "getgrent";608cmds[2] = "getgrent_r";609cmds[3] = "getgrnam_r";610cmds[4] = "getgrgid";611cmds[5] = "getgrgid_r";612CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);613cmds[0] = "setgrent";614cmds[1] = "getgrent";615cmds[2] = "getgrent_r";616cmds[3] = "getgrnam";617cmds[4] = "getgrnam_r";618cmds[5] = "getgrgid";619cmds[6] = "getgrgid_r";620CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);621cmds[0] = "getgrnam";622CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);623CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);624CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);625626CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |627GETGRNAM_R | GETGRGID | GETGRGID_R));628629cap_close(capgrp);630631/*632* Allow:633* cmds: setgrent, getgrent, getgrent_r, getgrnam,634* getgrgid, getgrgid_r635* fields: gr_name, gr_passwd, gr_gid, gr_mem636* groups:637* names: wheel, daemon, kmem, sys, operator638* gids:639* Disallow:640* cmds: getgrnam_r641* fields:642* groups:643*/644capgrp = cap_clone(origcapgrp);645CHECK(capgrp != NULL);646647cmds[0] = "setgrent";648cmds[1] = "getgrent";649cmds[2] = "getgrent_r";650cmds[3] = "getgrnam";651cmds[4] = "getgrgid";652cmds[5] = "getgrgid_r";653CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);654cmds[0] = "setgrent";655cmds[1] = "getgrent";656cmds[2] = "getgrent_r";657cmds[3] = "getgrnam";658cmds[4] = "getgrnam_r";659cmds[5] = "getgrgid";660cmds[6] = "getgrgid_r";661CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);662cmds[0] = "getgrnam_r";663CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);664CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);665666CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |667GETGRNAM | GETGRGID | GETGRGID_R));668669cap_close(capgrp);670671/*672* Allow:673* cmds: setgrent, getgrent, getgrent_r, getgrnam,674* getgrgid, getgrgid_r675* fields: gr_name, gr_passwd, gr_gid, gr_mem676* groups:677* names:678* gids: 0, 1, 2, 3, 5679* Disallow:680* cmds: getgrnam_r681* fields:682* groups:683*/684capgrp = cap_clone(origcapgrp);685CHECK(capgrp != NULL);686687cmds[0] = "setgrent";688cmds[1] = "getgrent";689cmds[2] = "getgrent_r";690cmds[3] = "getgrnam";691cmds[4] = "getgrgid";692cmds[5] = "getgrgid_r";693CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);694cmds[0] = "setgrent";695cmds[1] = "getgrent";696cmds[2] = "getgrent_r";697cmds[3] = "getgrnam";698cmds[4] = "getgrnam_r";699cmds[5] = "getgrgid";700cmds[6] = "getgrgid_r";701CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);702cmds[0] = "getgrnam_r";703CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);704CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);705706CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |707GETGRNAM | GETGRGID | GETGRGID_R));708709cap_close(capgrp);710711/*712* Allow:713* cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,714* getgrgid_r715* fields: gr_name, gr_passwd, gr_gid, gr_mem716* groups:717* names: wheel, daemon, kmem, sys, operator718* gids:719* Disallow:720* cmds: getgrgid721* fields:722* groups:723*/724capgrp = cap_clone(origcapgrp);725CHECK(capgrp != NULL);726727cmds[0] = "setgrent";728cmds[1] = "getgrent";729cmds[2] = "getgrent_r";730cmds[3] = "getgrnam";731cmds[4] = "getgrnam_r";732cmds[5] = "getgrgid_r";733CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);734cmds[0] = "setgrent";735cmds[1] = "getgrent";736cmds[2] = "getgrent_r";737cmds[3] = "getgrnam";738cmds[4] = "getgrnam_r";739cmds[5] = "getgrgid";740cmds[6] = "getgrgid_r";741CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);742cmds[0] = "getgrgid";743CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);744CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);745CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);746747CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |748GETGRNAM | GETGRNAM_R | GETGRGID_R));749750cap_close(capgrp);751752/*753* Allow:754* cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,755* getgrgid_r756* fields: gr_name, gr_passwd, gr_gid, gr_mem757* groups:758* names:759* gids: 0, 1, 2, 3, 5760* Disallow:761* cmds: getgrgid762* fields:763* groups:764*/765capgrp = cap_clone(origcapgrp);766CHECK(capgrp != NULL);767768cmds[0] = "setgrent";769cmds[1] = "getgrent";770cmds[2] = "getgrent_r";771cmds[3] = "getgrnam";772cmds[4] = "getgrnam_r";773cmds[5] = "getgrgid_r";774CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);775cmds[0] = "setgrent";776cmds[1] = "getgrent";777cmds[2] = "getgrent_r";778cmds[3] = "getgrnam";779cmds[4] = "getgrnam_r";780cmds[5] = "getgrgid";781cmds[6] = "getgrgid_r";782CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);783cmds[0] = "getgrgid";784CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);785CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);786CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);787788CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |789GETGRNAM | GETGRNAM_R | GETGRGID_R));790791cap_close(capgrp);792793/*794* Allow:795* cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,796* getgrgid797* fields: gr_name, gr_passwd, gr_gid, gr_mem798* groups:799* names: wheel, daemon, kmem, sys, operator800* gids:801* Disallow:802* cmds: getgrgid_r803* fields:804* groups:805*/806capgrp = cap_clone(origcapgrp);807CHECK(capgrp != NULL);808809cmds[0] = "setgrent";810cmds[1] = "getgrent";811cmds[2] = "getgrent_r";812cmds[3] = "getgrnam";813cmds[4] = "getgrnam_r";814cmds[5] = "getgrgid";815CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);816cmds[0] = "setgrent";817cmds[1] = "getgrent";818cmds[2] = "getgrent_r";819cmds[3] = "getgrnam";820cmds[4] = "getgrnam_r";821cmds[5] = "getgrgid";822cmds[6] = "getgrgid_r";823CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);824cmds[0] = "getgrgid_r";825CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);826CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);827828CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |829GETGRNAM | GETGRNAM_R | GETGRGID));830831cap_close(capgrp);832833/*834* Allow:835* cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,836* getgrgid837* fields: gr_name, gr_passwd, gr_gid, gr_mem838* groups:839* names:840* gids: 0, 1, 2, 3, 5841* Disallow:842* cmds: getgrgid_r843* fields:844* groups:845*/846capgrp = cap_clone(origcapgrp);847CHECK(capgrp != NULL);848849cmds[0] = "setgrent";850cmds[1] = "getgrent";851cmds[2] = "getgrent_r";852cmds[3] = "getgrnam";853cmds[4] = "getgrnam_r";854cmds[5] = "getgrgid";855CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);856cmds[0] = "setgrent";857cmds[1] = "getgrent";858cmds[2] = "getgrent_r";859cmds[3] = "getgrnam";860cmds[4] = "getgrnam_r";861cmds[5] = "getgrgid";862cmds[6] = "getgrgid_r";863CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);864cmds[0] = "getgrgid_r";865CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);866CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);867868CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |869GETGRNAM | GETGRNAM_R | GETGRGID));870871cap_close(capgrp);872}873874#define GR_NAME 0x01875#define GR_PASSWD 0x02876#define GR_GID 0x04877#define GR_MEM 0x08878879static unsigned int880group_fields(const struct group *grp)881{882unsigned int result;883884result = 0;885886if (grp->gr_name != NULL && grp->gr_name[0] != '\0')887result |= GR_NAME;888889if (grp->gr_passwd != NULL && grp->gr_passwd[0] != '\0')890result |= GR_PASSWD;891892if (grp->gr_gid != (gid_t)-1)893result |= GR_GID;894895if (grp->gr_mem != NULL && grp->gr_mem[0] != NULL)896result |= GR_MEM;897898return (result);899}900901static bool902runtest_fields(cap_channel_t *capgrp, unsigned int expected)903{904char buf[1024];905struct group *grp;906struct group st;907908(void)cap_setgrent(capgrp);909grp = cap_getgrent(capgrp);910if (group_fields(grp) != expected)911return (false);912913(void)cap_setgrent(capgrp);914cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);915if (group_fields(grp) != expected)916return (false);917918grp = cap_getgrnam(capgrp, "wheel");919if (group_fields(grp) != expected)920return (false);921922cap_getgrnam_r(capgrp, "wheel", &st, buf, sizeof(buf), &grp);923if (group_fields(grp) != expected)924return (false);925926grp = cap_getgrgid(capgrp, GID_WHEEL);927if (group_fields(grp) != expected)928return (false);929930cap_getgrgid_r(capgrp, GID_WHEEL, &st, buf, sizeof(buf), &grp);931if (group_fields(grp) != expected)932return (false);933934return (true);935}936937static void938test_fields(cap_channel_t *origcapgrp)939{940cap_channel_t *capgrp;941const char *fields[4];942943/* No limits. */944945CHECK(runtest_fields(origcapgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));946947/*948* Allow:949* fields: gr_name, gr_passwd, gr_gid, gr_mem950*/951capgrp = cap_clone(origcapgrp);952CHECK(capgrp != NULL);953954fields[0] = "gr_name";955fields[1] = "gr_passwd";956fields[2] = "gr_gid";957fields[3] = "gr_mem";958CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);959960CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));961962cap_close(capgrp);963964/*965* Allow:966* fields: gr_passwd, gr_gid, gr_mem967*/968capgrp = cap_clone(origcapgrp);969CHECK(capgrp != NULL);970971fields[0] = "gr_passwd";972fields[1] = "gr_gid";973fields[2] = "gr_mem";974CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);975fields[0] = "gr_name";976fields[1] = "gr_passwd";977fields[2] = "gr_gid";978fields[3] = "gr_mem";979CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&980errno == ENOTCAPABLE);981982CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID | GR_MEM));983984cap_close(capgrp);985986/*987* Allow:988* fields: gr_name, gr_gid, gr_mem989*/990capgrp = cap_clone(origcapgrp);991CHECK(capgrp != NULL);992993fields[0] = "gr_name";994fields[1] = "gr_gid";995fields[2] = "gr_mem";996CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);997fields[0] = "gr_name";998fields[1] = "gr_passwd";999fields[2] = "gr_gid";1000fields[3] = "gr_mem";1001CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1002errno == ENOTCAPABLE);1003fields[0] = "gr_passwd";1004CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1005errno == ENOTCAPABLE);10061007CHECK(runtest_fields(capgrp, GR_NAME | GR_GID | GR_MEM));10081009cap_close(capgrp);10101011/*1012* Allow:1013* fields: gr_name, gr_passwd, gr_mem1014*/1015capgrp = cap_clone(origcapgrp);1016CHECK(capgrp != NULL);10171018fields[0] = "gr_name";1019fields[1] = "gr_passwd";1020fields[2] = "gr_mem";1021CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);1022fields[0] = "gr_name";1023fields[1] = "gr_passwd";1024fields[2] = "gr_gid";1025fields[3] = "gr_mem";1026CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1027errno == ENOTCAPABLE);1028fields[0] = "gr_gid";1029CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1030errno == ENOTCAPABLE);10311032CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_MEM));10331034cap_close(capgrp);10351036/*1037* Allow:1038* fields: gr_name, gr_passwd, gr_gid1039*/1040capgrp = cap_clone(origcapgrp);1041CHECK(capgrp != NULL);10421043fields[0] = "gr_name";1044fields[1] = "gr_passwd";1045fields[2] = "gr_gid";1046CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);1047fields[0] = "gr_name";1048fields[1] = "gr_passwd";1049fields[2] = "gr_gid";1050fields[3] = "gr_mem";1051CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1052errno == ENOTCAPABLE);1053fields[0] = "gr_mem";1054CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1055errno == ENOTCAPABLE);10561057CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID));10581059cap_close(capgrp);10601061/*1062* Allow:1063* fields: gr_name, gr_passwd1064*/1065capgrp = cap_clone(origcapgrp);1066CHECK(capgrp != NULL);10671068fields[0] = "gr_name";1069fields[1] = "gr_passwd";1070CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);1071fields[0] = "gr_name";1072fields[1] = "gr_passwd";1073fields[2] = "gr_gid";1074fields[3] = "gr_mem";1075CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1076errno == ENOTCAPABLE);1077fields[0] = "gr_gid";1078CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1079errno == ENOTCAPABLE);10801081CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD));10821083cap_close(capgrp);10841085/*1086* Allow:1087* fields: gr_name, gr_gid1088*/1089capgrp = cap_clone(origcapgrp);1090CHECK(capgrp != NULL);10911092fields[0] = "gr_name";1093fields[1] = "gr_gid";1094CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);1095fields[0] = "gr_name";1096fields[1] = "gr_passwd";1097fields[2] = "gr_gid";1098fields[3] = "gr_mem";1099CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1100errno == ENOTCAPABLE);1101fields[0] = "gr_mem";1102CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1103errno == ENOTCAPABLE);11041105CHECK(runtest_fields(capgrp, GR_NAME | GR_GID));11061107cap_close(capgrp);11081109/*1110* Allow:1111* fields: gr_name, gr_mem1112*/1113capgrp = cap_clone(origcapgrp);1114CHECK(capgrp != NULL);11151116fields[0] = "gr_name";1117fields[1] = "gr_mem";1118CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);1119fields[0] = "gr_name";1120fields[1] = "gr_passwd";1121fields[2] = "gr_gid";1122fields[3] = "gr_mem";1123CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1124errno == ENOTCAPABLE);1125fields[0] = "gr_passwd";1126CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1127errno == ENOTCAPABLE);11281129CHECK(runtest_fields(capgrp, GR_NAME | GR_MEM));11301131cap_close(capgrp);11321133/*1134* Allow:1135* fields: gr_passwd, gr_gid1136*/1137capgrp = cap_clone(origcapgrp);1138CHECK(capgrp != NULL);11391140fields[0] = "gr_passwd";1141fields[1] = "gr_gid";1142CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);1143fields[0] = "gr_name";1144fields[1] = "gr_passwd";1145fields[2] = "gr_gid";1146fields[3] = "gr_mem";1147CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1148errno == ENOTCAPABLE);1149fields[0] = "gr_mem";1150CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1151errno == ENOTCAPABLE);11521153CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID));11541155cap_close(capgrp);11561157/*1158* Allow:1159* fields: gr_passwd, gr_mem1160*/1161capgrp = cap_clone(origcapgrp);1162CHECK(capgrp != NULL);11631164fields[0] = "gr_passwd";1165fields[1] = "gr_mem";1166CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);1167fields[0] = "gr_name";1168fields[1] = "gr_passwd";1169fields[2] = "gr_gid";1170fields[3] = "gr_mem";1171CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1172errno == ENOTCAPABLE);1173fields[0] = "gr_gid";1174CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1175errno == ENOTCAPABLE);11761177CHECK(runtest_fields(capgrp, GR_PASSWD | GR_MEM));11781179cap_close(capgrp);11801181/*1182* Allow:1183* fields: gr_gid, gr_mem1184*/1185capgrp = cap_clone(origcapgrp);1186CHECK(capgrp != NULL);11871188fields[0] = "gr_gid";1189fields[1] = "gr_mem";1190CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);1191fields[0] = "gr_name";1192fields[1] = "gr_passwd";1193fields[2] = "gr_gid";1194fields[3] = "gr_mem";1195CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&1196errno == ENOTCAPABLE);1197fields[0] = "gr_passwd";1198CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&1199errno == ENOTCAPABLE);12001201CHECK(runtest_fields(capgrp, GR_GID | GR_MEM));12021203cap_close(capgrp);1204}12051206static bool1207runtest_groups(cap_channel_t *capgrp, const char **names, const gid_t *gids,1208size_t ngroups)1209{1210char buf[1024];1211struct group *grp;1212struct group st;1213unsigned int i, got;12141215(void)cap_setgrent(capgrp);1216got = 0;1217for (;;) {1218grp = cap_getgrent(capgrp);1219if (grp == NULL)1220break;1221got++;1222for (i = 0; i < ngroups; i++) {1223if (strcmp(names[i], grp->gr_name) == 0 &&1224gids[i] == grp->gr_gid) {1225break;1226}1227}1228if (i == ngroups)1229return (false);1230}1231if (got != ngroups)1232return (false);12331234(void)cap_setgrent(capgrp);1235got = 0;1236for (;;) {1237cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);1238if (grp == NULL)1239break;1240got++;1241for (i = 0; i < ngroups; i++) {1242if (strcmp(names[i], grp->gr_name) == 0 &&1243gids[i] == grp->gr_gid) {1244break;1245}1246}1247if (i == ngroups)1248return (false);1249}1250if (got != ngroups)1251return (false);12521253for (i = 0; i < ngroups; i++) {1254grp = cap_getgrnam(capgrp, names[i]);1255if (grp == NULL)1256return (false);1257}12581259for (i = 0; i < ngroups; i++) {1260cap_getgrnam_r(capgrp, names[i], &st, buf, sizeof(buf), &grp);1261if (grp == NULL)1262return (false);1263}12641265for (i = 0; i < ngroups; i++) {1266grp = cap_getgrgid(capgrp, gids[i]);1267if (grp == NULL)1268return (false);1269}12701271for (i = 0; i < ngroups; i++) {1272cap_getgrgid_r(capgrp, gids[i], &st, buf, sizeof(buf), &grp);1273if (grp == NULL)1274return (false);1275}12761277return (true);1278}12791280static void1281test_groups(cap_channel_t *origcapgrp)1282{1283cap_channel_t *capgrp;1284const char *names[5];1285gid_t gids[5];12861287/*1288* Allow:1289* groups:1290* names: wheel, daemon, kmem, sys, tty1291* gids:1292*/1293capgrp = cap_clone(origcapgrp);1294CHECK(capgrp != NULL);12951296names[0] = "wheel";1297names[1] = "daemon";1298names[2] = "kmem";1299names[3] = "sys";1300names[4] = "tty";1301CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);1302gids[0] = 0;1303gids[1] = 1;1304gids[2] = 2;1305gids[3] = 3;1306gids[4] = 4;13071308CHECK(runtest_groups(capgrp, names, gids, 5));13091310cap_close(capgrp);13111312/*1313* Allow:1314* groups:1315* names: kmem, sys, tty1316* gids:1317*/1318capgrp = cap_clone(origcapgrp);1319CHECK(capgrp != NULL);13201321names[0] = "kmem";1322names[1] = "sys";1323names[2] = "tty";1324CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);1325names[3] = "daemon";1326CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&1327errno == ENOTCAPABLE);1328names[0] = "daemon";1329CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&1330errno == ENOTCAPABLE);1331names[0] = "kmem";1332gids[0] = 2;1333gids[1] = 3;1334gids[2] = 4;13351336CHECK(runtest_groups(capgrp, names, gids, 3));13371338cap_close(capgrp);13391340/*1341* Allow:1342* groups:1343* names: wheel, kmem, tty1344* gids:1345*/1346capgrp = cap_clone(origcapgrp);1347CHECK(capgrp != NULL);13481349names[0] = "wheel";1350names[1] = "kmem";1351names[2] = "tty";1352CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);1353names[3] = "daemon";1354CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&1355errno == ENOTCAPABLE);1356names[0] = "daemon";1357CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&1358errno == ENOTCAPABLE);1359names[0] = "wheel";1360gids[0] = 0;1361gids[1] = 2;1362gids[2] = 4;13631364CHECK(runtest_groups(capgrp, names, gids, 3));13651366cap_close(capgrp);13671368/*1369* Allow:1370* groups:1371* names:1372* gids: 2, 3, 41373*/1374capgrp = cap_clone(origcapgrp);1375CHECK(capgrp != NULL);13761377names[0] = "kmem";1378names[1] = "sys";1379names[2] = "tty";1380gids[0] = 2;1381gids[1] = 3;1382gids[2] = 4;1383CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);1384gids[3] = 0;1385CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&1386errno == ENOTCAPABLE);1387gids[0] = 0;1388CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&1389errno == ENOTCAPABLE);1390gids[0] = 2;13911392CHECK(runtest_groups(capgrp, names, gids, 3));13931394cap_close(capgrp);13951396/*1397* Allow:1398* groups:1399* names:1400* gids: 0, 2, 41401*/1402capgrp = cap_clone(origcapgrp);1403CHECK(capgrp != NULL);14041405names[0] = "wheel";1406names[1] = "kmem";1407names[2] = "tty";1408gids[0] = 0;1409gids[1] = 2;1410gids[2] = 4;1411CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);1412gids[3] = 1;1413CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&1414errno == ENOTCAPABLE);1415gids[0] = 1;1416CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&1417errno == ENOTCAPABLE);1418gids[0] = 0;14191420CHECK(runtest_groups(capgrp, names, gids, 3));14211422cap_close(capgrp);14231424/*1425* Allow:1426* groups:1427* names: kmem1428* gids:1429*/1430capgrp = cap_clone(origcapgrp);1431CHECK(capgrp != NULL);14321433names[0] = "kmem";1434CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == 0);1435names[1] = "daemon";1436CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == -1 &&1437errno == ENOTCAPABLE);1438names[0] = "daemon";1439CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&1440errno == ENOTCAPABLE);1441names[0] = "kmem";1442gids[0] = 2;14431444CHECK(runtest_groups(capgrp, names, gids, 1));14451446cap_close(capgrp);14471448/*1449* Allow:1450* groups:1451* names: wheel, tty1452* gids:1453*/1454capgrp = cap_clone(origcapgrp);1455CHECK(capgrp != NULL);14561457names[0] = "wheel";1458names[1] = "tty";1459CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == 0);1460names[2] = "daemon";1461CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == -1 &&1462errno == ENOTCAPABLE);1463names[0] = "daemon";1464CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&1465errno == ENOTCAPABLE);1466names[0] = "wheel";1467gids[0] = 0;1468gids[1] = 4;14691470CHECK(runtest_groups(capgrp, names, gids, 2));14711472cap_close(capgrp);14731474/*1475* Allow:1476* groups:1477* names:1478* gids: 21479*/1480capgrp = cap_clone(origcapgrp);1481CHECK(capgrp != NULL);14821483names[0] = "kmem";1484gids[0] = 2;1485CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == 0);1486gids[1] = 1;1487CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == -1 &&1488errno == ENOTCAPABLE);1489gids[0] = 1;1490CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&1491errno == ENOTCAPABLE);1492gids[0] = 2;14931494CHECK(runtest_groups(capgrp, names, gids, 1));14951496cap_close(capgrp);14971498/*1499* Allow:1500* groups:1501* names:1502* gids: 0, 41503*/1504capgrp = cap_clone(origcapgrp);1505CHECK(capgrp != NULL);15061507names[0] = "wheel";1508names[1] = "tty";1509gids[0] = 0;1510gids[1] = 4;1511CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == 0);1512gids[2] = 1;1513CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == -1 &&1514errno == ENOTCAPABLE);1515gids[0] = 1;1516CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&1517errno == ENOTCAPABLE);1518gids[0] = 0;15191520CHECK(runtest_groups(capgrp, names, gids, 2));15211522cap_close(capgrp);1523}15241525int1526main(void)1527{1528cap_channel_t *capcas, *capgrp;15291530printf("1..199\n");1531fflush(stdout);15321533capcas = cap_init();1534CHECKX(capcas != NULL);15351536capgrp = cap_service_open(capcas, "system.grp");1537CHECKX(capgrp != NULL);15381539cap_close(capcas);15401541/* No limits. */15421543CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |1544GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));15451546test_cmds(capgrp);15471548test_fields(capgrp);15491550test_groups(capgrp);15511552cap_close(capgrp);15531554exit(0);1555}155615571558