Path: blob/main/lib/libcasper/services/cap_pwd/tests/pwd_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 <pwd.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_pwd.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 UID_ROOT 068#define UID_OPERATOR 26970#define GETPWENT0 0x000171#define GETPWENT1 0x000272#define GETPWENT2 0x000473#define GETPWENT (GETPWENT0 | GETPWENT1 | GETPWENT2)74#define GETPWENT_R0 0x000875#define GETPWENT_R1 0x001076#define GETPWENT_R2 0x002077#define GETPWENT_R (GETPWENT_R0 | GETPWENT_R1 | GETPWENT_R2)78#define GETPWNAM 0x004079#define GETPWNAM_R 0x008080#define GETPWUID 0x010081#define GETPWUID_R 0x02008283static bool84passwd_compare(const struct passwd *pwd0, const struct passwd *pwd1)85{8687if (pwd0 == NULL && pwd1 == NULL)88return (true);89if (pwd0 == NULL || pwd1 == NULL)90return (false);9192if (strcmp(pwd0->pw_name, pwd1->pw_name) != 0)93return (false);9495if (pwd0->pw_passwd != NULL || pwd1->pw_passwd != NULL) {96if (pwd0->pw_passwd == NULL || pwd1->pw_passwd == NULL)97return (false);98if (strcmp(pwd0->pw_passwd, pwd1->pw_passwd) != 0)99return (false);100}101102if (pwd0->pw_uid != pwd1->pw_uid)103return (false);104105if (pwd0->pw_gid != pwd1->pw_gid)106return (false);107108if (pwd0->pw_change != pwd1->pw_change)109return (false);110111if (pwd0->pw_class != NULL || pwd1->pw_class != NULL) {112if (pwd0->pw_class == NULL || pwd1->pw_class == NULL)113return (false);114if (strcmp(pwd0->pw_class, pwd1->pw_class) != 0)115return (false);116}117118if (pwd0->pw_gecos != NULL || pwd1->pw_gecos != NULL) {119if (pwd0->pw_gecos == NULL || pwd1->pw_gecos == NULL)120return (false);121if (strcmp(pwd0->pw_gecos, pwd1->pw_gecos) != 0)122return (false);123}124125if (pwd0->pw_dir != NULL || pwd1->pw_dir != NULL) {126if (pwd0->pw_dir == NULL || pwd1->pw_dir == NULL)127return (false);128if (strcmp(pwd0->pw_dir, pwd1->pw_dir) != 0)129return (false);130}131132if (pwd0->pw_shell != NULL || pwd1->pw_shell != NULL) {133if (pwd0->pw_shell == NULL || pwd1->pw_shell == NULL)134return (false);135if (strcmp(pwd0->pw_shell, pwd1->pw_shell) != 0)136return (false);137}138139if (pwd0->pw_expire != pwd1->pw_expire)140return (false);141142if (pwd0->pw_fields != pwd1->pw_fields)143return (false);144145return (true);146}147148static unsigned int149runtest_cmds(cap_channel_t *cappwd)150{151char bufs[1024], bufc[1024];152unsigned int result;153struct passwd *pwds, *pwdc;154struct passwd sts, stc;155156result = 0;157158setpwent();159cap_setpwent(cappwd);160161pwds = getpwent();162pwdc = cap_getpwent(cappwd);163if (passwd_compare(pwds, pwdc)) {164result |= GETPWENT0;165pwds = getpwent();166pwdc = cap_getpwent(cappwd);167if (passwd_compare(pwds, pwdc))168result |= GETPWENT1;169}170171getpwent_r(&sts, bufs, sizeof(bufs), &pwds);172cap_getpwent_r(cappwd, &stc, bufc, sizeof(bufc), &pwdc);173if (passwd_compare(pwds, pwdc)) {174result |= GETPWENT_R0;175getpwent_r(&sts, bufs, sizeof(bufs), &pwds);176cap_getpwent_r(cappwd, &stc, bufc, sizeof(bufc), &pwdc);177if (passwd_compare(pwds, pwdc))178result |= GETPWENT_R1;179}180181setpwent();182cap_setpwent(cappwd);183184getpwent_r(&sts, bufs, sizeof(bufs), &pwds);185cap_getpwent_r(cappwd, &stc, bufc, sizeof(bufc), &pwdc);186if (passwd_compare(pwds, pwdc))187result |= GETPWENT_R2;188189pwds = getpwent();190pwdc = cap_getpwent(cappwd);191if (passwd_compare(pwds, pwdc))192result |= GETPWENT2;193194pwds = getpwnam("root");195pwdc = cap_getpwnam(cappwd, "root");196if (passwd_compare(pwds, pwdc)) {197pwds = getpwnam("operator");198pwdc = cap_getpwnam(cappwd, "operator");199if (passwd_compare(pwds, pwdc))200result |= GETPWNAM;201}202203getpwnam_r("root", &sts, bufs, sizeof(bufs), &pwds);204cap_getpwnam_r(cappwd, "root", &stc, bufc, sizeof(bufc), &pwdc);205if (passwd_compare(pwds, pwdc)) {206getpwnam_r("operator", &sts, bufs, sizeof(bufs), &pwds);207cap_getpwnam_r(cappwd, "operator", &stc, bufc, sizeof(bufc),208&pwdc);209if (passwd_compare(pwds, pwdc))210result |= GETPWNAM_R;211}212213pwds = getpwuid(UID_ROOT);214pwdc = cap_getpwuid(cappwd, UID_ROOT);215if (passwd_compare(pwds, pwdc)) {216pwds = getpwuid(UID_OPERATOR);217pwdc = cap_getpwuid(cappwd, UID_OPERATOR);218if (passwd_compare(pwds, pwdc))219result |= GETPWUID;220}221222getpwuid_r(UID_ROOT, &sts, bufs, sizeof(bufs), &pwds);223cap_getpwuid_r(cappwd, UID_ROOT, &stc, bufc, sizeof(bufc), &pwdc);224if (passwd_compare(pwds, pwdc)) {225getpwuid_r(UID_OPERATOR, &sts, bufs, sizeof(bufs), &pwds);226cap_getpwuid_r(cappwd, UID_OPERATOR, &stc, bufc, sizeof(bufc),227&pwdc);228if (passwd_compare(pwds, pwdc))229result |= GETPWUID_R;230}231232return (result);233}234235static void236test_cmds(cap_channel_t *origcappwd)237{238cap_channel_t *cappwd;239const char *cmds[7], *fields[10], *names[6];240uid_t uids[5];241242fields[0] = "pw_name";243fields[1] = "pw_passwd";244fields[2] = "pw_uid";245fields[3] = "pw_gid";246fields[4] = "pw_change";247fields[5] = "pw_class";248fields[6] = "pw_gecos";249fields[7] = "pw_dir";250fields[8] = "pw_shell";251fields[9] = "pw_expire";252253names[0] = "root";254names[1] = "toor";255names[2] = "daemon";256names[3] = "operator";257names[4] = "bin";258names[5] = "kmem";259260uids[0] = 0;261uids[1] = 1;262uids[2] = 2;263uids[3] = 3;264uids[4] = 5;265266/*267* Allow:268* cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r,269* getpwuid, getpwuid_r270* users:271* names: root, toor, daemon, operator, bin, kmem272* uids:273*/274cappwd = cap_clone(origcappwd);275CHECK(cappwd != NULL);276277cmds[0] = "setpwent";278cmds[1] = "getpwent";279cmds[2] = "getpwent_r";280cmds[3] = "getpwnam";281cmds[4] = "getpwnam_r";282cmds[5] = "getpwuid";283cmds[6] = "getpwuid_r";284CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == 0);285CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);286CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);287288CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |289GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));290291cap_close(cappwd);292293/*294* Allow:295* cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r,296* getpwuid, getpwuid_r297* users:298* names:299* uids: 0, 1, 2, 3, 5300*/301cappwd = cap_clone(origcappwd);302CHECK(cappwd != NULL);303304cmds[0] = "setpwent";305cmds[1] = "getpwent";306cmds[2] = "getpwent_r";307cmds[3] = "getpwnam";308cmds[4] = "getpwnam_r";309cmds[5] = "getpwuid";310cmds[6] = "getpwuid_r";311CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == 0);312CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);313CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);314315CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |316GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));317318cap_close(cappwd);319320/*321* Allow:322* cmds: getpwent, getpwent_r, getpwnam, getpwnam_r,323* getpwuid, getpwuid_r324* users:325* names: root, toor, daemon, operator, bin, kmem326* uids:327* Disallow:328* cmds: setpwent329* users:330*/331cappwd = cap_clone(origcappwd);332CHECK(cappwd != NULL);333334cap_setpwent(cappwd);335336cmds[0] = "getpwent";337cmds[1] = "getpwent_r";338cmds[2] = "getpwnam";339cmds[3] = "getpwnam_r";340cmds[4] = "getpwuid";341cmds[5] = "getpwuid_r";342CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);343cmds[0] = "setpwent";344cmds[1] = "getpwent";345cmds[2] = "getpwent_r";346cmds[3] = "getpwnam";347cmds[4] = "getpwnam_r";348cmds[5] = "getpwuid";349cmds[6] = "getpwuid_r";350CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);351cmds[0] = "setpwent";352CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);353CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);354CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);355356CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 | GETPWENT_R0 |357GETPWENT_R1 | GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));358359cap_close(cappwd);360361/*362* Allow:363* cmds: getpwent, getpwent_r, getpwnam, getpwnam_r,364* getpwuid, getpwuid_r365* users:366* names:367* uids: 0, 1, 2, 3, 5368* Disallow:369* cmds: setpwent370* users:371*/372cappwd = cap_clone(origcappwd);373CHECK(cappwd != NULL);374375cap_setpwent(cappwd);376377cmds[0] = "getpwent";378cmds[1] = "getpwent_r";379cmds[2] = "getpwnam";380cmds[3] = "getpwnam_r";381cmds[4] = "getpwuid";382cmds[5] = "getpwuid_r";383CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);384cmds[0] = "setpwent";385cmds[1] = "getpwent";386cmds[2] = "getpwent_r";387cmds[3] = "getpwnam";388cmds[4] = "getpwnam_r";389cmds[5] = "getpwuid";390cmds[6] = "getpwuid_r";391CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);392cmds[0] = "setpwent";393CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);394CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);395CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);396397CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 | GETPWENT_R0 |398GETPWENT_R1 | GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));399400cap_close(cappwd);401402/*403* Allow:404* cmds: setpwent, getpwent_r, getpwnam, getpwnam_r,405* getpwuid, getpwuid_r406* users:407* names: root, toor, daemon, operator, bin, kmem408* uids:409* Disallow:410* cmds: getpwent411* users:412*/413cappwd = cap_clone(origcappwd);414CHECK(cappwd != NULL);415416cmds[0] = "setpwent";417cmds[1] = "getpwent_r";418cmds[2] = "getpwnam";419cmds[3] = "getpwnam_r";420cmds[4] = "getpwuid";421cmds[5] = "getpwuid_r";422CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);423cmds[0] = "setpwent";424cmds[1] = "getpwent";425cmds[2] = "getpwent_r";426cmds[3] = "getpwnam";427cmds[4] = "getpwnam_r";428cmds[5] = "getpwuid";429cmds[6] = "getpwuid_r";430CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);431cmds[0] = "getpwent";432CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);433CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);434CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);435436CHECK(runtest_cmds(cappwd) == (GETPWENT_R2 |437GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));438439cap_close(cappwd);440441/*442* Allow:443* cmds: setpwent, getpwent_r, getpwnam, getpwnam_r,444* getpwuid, getpwuid_r445* users:446* names:447* uids: 0, 1, 2, 3, 5448* Disallow:449* cmds: getpwent450* users:451*/452cappwd = cap_clone(origcappwd);453CHECK(cappwd != NULL);454455cmds[0] = "setpwent";456cmds[1] = "getpwent_r";457cmds[2] = "getpwnam";458cmds[3] = "getpwnam_r";459cmds[4] = "getpwuid";460cmds[5] = "getpwuid_r";461CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);462cmds[0] = "setpwent";463cmds[1] = "getpwent";464cmds[2] = "getpwent_r";465cmds[3] = "getpwnam";466cmds[4] = "getpwnam_r";467cmds[5] = "getpwuid";468cmds[6] = "getpwuid_r";469CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);470cmds[0] = "getpwent";471CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);472CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);473CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);474475CHECK(runtest_cmds(cappwd) == (GETPWENT_R2 |476GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));477478cap_close(cappwd);479480/*481* Allow:482* cmds: setpwent, getpwent, getpwnam, getpwnam_r,483* getpwuid, getpwuid_r484* users:485* names: root, toor, daemon, operator, bin, kmem486* uids:487* Disallow:488* cmds: getpwent_r489* users:490*/491cappwd = cap_clone(origcappwd);492CHECK(cappwd != NULL);493494cmds[0] = "setpwent";495cmds[1] = "getpwent";496cmds[2] = "getpwnam";497cmds[3] = "getpwnam_r";498cmds[4] = "getpwuid";499cmds[5] = "getpwuid_r";500CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);501cmds[0] = "setpwent";502cmds[1] = "getpwent";503cmds[2] = "getpwent_r";504cmds[3] = "getpwnam";505cmds[4] = "getpwnam_r";506cmds[5] = "getpwuid";507cmds[6] = "getpwuid_r";508CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);509cmds[0] = "getpwent_r";510CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);511CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);512CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);513514CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 |515GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));516517cap_close(cappwd);518519/*520* Allow:521* cmds: setpwent, getpwent, getpwnam, getpwnam_r,522* getpwuid, getpwuid_r523* users:524* names:525* uids: 0, 1, 2, 3, 5526* Disallow:527* cmds: getpwent_r528* users:529*/530cappwd = cap_clone(origcappwd);531CHECK(cappwd != NULL);532533cmds[0] = "setpwent";534cmds[1] = "getpwent";535cmds[2] = "getpwnam";536cmds[3] = "getpwnam_r";537cmds[4] = "getpwuid";538cmds[5] = "getpwuid_r";539CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);540cmds[0] = "setpwent";541cmds[1] = "getpwent";542cmds[2] = "getpwent_r";543cmds[3] = "getpwnam";544cmds[4] = "getpwnam_r";545cmds[5] = "getpwuid";546cmds[6] = "getpwuid_r";547CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);548cmds[0] = "getpwent_r";549CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);550CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);551CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);552553CHECK(runtest_cmds(cappwd) == (GETPWENT0 | GETPWENT1 |554GETPWNAM | GETPWNAM_R | GETPWUID | GETPWUID_R));555556cap_close(cappwd);557558/*559* Allow:560* cmds: setpwent, getpwent, getpwent_r, getpwnam_r,561* getpwuid, getpwuid_r562* users:563* names: root, toor, daemon, operator, bin, kmem564* uids:565* Disallow:566* cmds: getpwnam567* users:568*/569cappwd = cap_clone(origcappwd);570CHECK(cappwd != NULL);571572cmds[0] = "setpwent";573cmds[1] = "getpwent";574cmds[2] = "getpwent_r";575cmds[3] = "getpwnam_r";576cmds[4] = "getpwuid";577cmds[5] = "getpwuid_r";578CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);579cmds[0] = "setpwent";580cmds[1] = "getpwent";581cmds[2] = "getpwent_r";582cmds[3] = "getpwnam";583cmds[4] = "getpwnam_r";584cmds[5] = "getpwuid";585cmds[6] = "getpwuid_r";586CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);587cmds[0] = "getpwnam";588CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);589CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);590CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);591592CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |593GETPWNAM_R | GETPWUID | GETPWUID_R));594595cap_close(cappwd);596597/*598* Allow:599* cmds: setpwent, getpwent, getpwent_r, getpwnam_r,600* getpwuid, getpwuid_r601* users:602* names:603* uids: 0, 1, 2, 3, 5604* Disallow:605* cmds: getpwnam606* users:607*/608cappwd = cap_clone(origcappwd);609CHECK(cappwd != NULL);610611cmds[0] = "setpwent";612cmds[1] = "getpwent";613cmds[2] = "getpwent_r";614cmds[3] = "getpwnam_r";615cmds[4] = "getpwuid";616cmds[5] = "getpwuid_r";617CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);618cmds[0] = "setpwent";619cmds[1] = "getpwent";620cmds[2] = "getpwent_r";621cmds[3] = "getpwnam";622cmds[4] = "getpwnam_r";623cmds[5] = "getpwuid";624cmds[6] = "getpwuid_r";625CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);626cmds[0] = "getpwnam";627CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);628CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);629CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);630631CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |632GETPWNAM_R | GETPWUID | GETPWUID_R));633634cap_close(cappwd);635636/*637* Allow:638* cmds: setpwent, getpwent, getpwent_r, getpwnam,639* getpwuid, getpwuid_r640* users:641* names: root, toor, daemon, operator, bin, kmem642* uids:643* Disallow:644* cmds: getpwnam_r645* users:646*/647cappwd = cap_clone(origcappwd);648CHECK(cappwd != NULL);649650cmds[0] = "setpwent";651cmds[1] = "getpwent";652cmds[2] = "getpwent_r";653cmds[3] = "getpwnam";654cmds[4] = "getpwuid";655cmds[5] = "getpwuid_r";656CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);657cmds[0] = "setpwent";658cmds[1] = "getpwent";659cmds[2] = "getpwent_r";660cmds[3] = "getpwnam";661cmds[4] = "getpwnam_r";662cmds[5] = "getpwuid";663cmds[6] = "getpwuid_r";664CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);665cmds[0] = "getpwnam_r";666CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);667CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);668CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);669670CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |671GETPWNAM | GETPWUID | GETPWUID_R));672673cap_close(cappwd);674675/*676* Allow:677* cmds: setpwent, getpwent, getpwent_r, getpwnam,678* getpwuid, getpwuid_r679* users:680* names:681* uids: 0, 1, 2, 3, 5682* Disallow:683* cmds: getpwnam_r684* users:685*/686cappwd = cap_clone(origcappwd);687CHECK(cappwd != NULL);688689cmds[0] = "setpwent";690cmds[1] = "getpwent";691cmds[2] = "getpwent_r";692cmds[3] = "getpwnam";693cmds[4] = "getpwuid";694cmds[5] = "getpwuid_r";695CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);696cmds[0] = "setpwent";697cmds[1] = "getpwent";698cmds[2] = "getpwent_r";699cmds[3] = "getpwnam";700cmds[4] = "getpwnam_r";701cmds[5] = "getpwuid";702cmds[6] = "getpwuid_r";703CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);704cmds[0] = "getpwnam_r";705CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);706CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);707CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);708709CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |710GETPWNAM | GETPWUID | GETPWUID_R));711712cap_close(cappwd);713714/*715* Allow:716* cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r,717* getpwuid_r718* users:719* names: root, toor, daemon, operator, bin, kmem720* uids:721* Disallow:722* cmds: getpwuid723* users:724*/725cappwd = cap_clone(origcappwd);726CHECK(cappwd != NULL);727728cmds[0] = "setpwent";729cmds[1] = "getpwent";730cmds[2] = "getpwent_r";731cmds[3] = "getpwnam";732cmds[4] = "getpwnam_r";733cmds[5] = "getpwuid_r";734CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);735cmds[0] = "setpwent";736cmds[1] = "getpwent";737cmds[2] = "getpwent_r";738cmds[3] = "getpwnam";739cmds[4] = "getpwnam_r";740cmds[5] = "getpwuid";741cmds[6] = "getpwuid_r";742CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);743cmds[0] = "getpwuid";744CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);745CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);746CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);747748CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |749GETPWNAM | GETPWNAM_R | GETPWUID_R));750751cap_close(cappwd);752753/*754* Allow:755* cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r,756* getpwuid_r757* users:758* names:759* uids: 0, 1, 2, 3, 5760* Disallow:761* cmds: getpwuid762* users:763*/764cappwd = cap_clone(origcappwd);765CHECK(cappwd != NULL);766767cmds[0] = "setpwent";768cmds[1] = "getpwent";769cmds[2] = "getpwent_r";770cmds[3] = "getpwnam";771cmds[4] = "getpwnam_r";772cmds[5] = "getpwuid_r";773CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);774cmds[0] = "setpwent";775cmds[1] = "getpwent";776cmds[2] = "getpwent_r";777cmds[3] = "getpwnam";778cmds[4] = "getpwnam_r";779cmds[5] = "getpwuid";780cmds[6] = "getpwuid_r";781CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);782cmds[0] = "getpwuid";783CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);784CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);785CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);786787CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |788GETPWNAM | GETPWNAM_R | GETPWUID_R));789790cap_close(cappwd);791792/*793* Allow:794* cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r,795* getpwuid796* users:797* names: root, toor, daemon, operator, bin, kmem798* uids:799* Disallow:800* cmds: getpwuid_r801* users:802*/803cappwd = cap_clone(origcappwd);804CHECK(cappwd != NULL);805806cmds[0] = "setpwent";807cmds[1] = "getpwent";808cmds[2] = "getpwent_r";809cmds[3] = "getpwnam";810cmds[4] = "getpwnam_r";811cmds[5] = "getpwuid";812CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);813cmds[0] = "setpwent";814cmds[1] = "getpwent";815cmds[2] = "getpwent_r";816cmds[3] = "getpwnam";817cmds[4] = "getpwnam_r";818cmds[5] = "getpwuid";819cmds[6] = "getpwuid_r";820CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);821cmds[0] = "getpwuid_r";822CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);823CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);824CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);825826CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |827GETPWNAM | GETPWNAM_R | GETPWUID));828829cap_close(cappwd);830831/*832* Allow:833* cmds: setpwent, getpwent, getpwent_r, getpwnam, getpwnam_r,834* getpwuid835* users:836* names:837* uids: 0, 1, 2, 3, 5838* Disallow:839* cmds: getpwuid_r840* users:841*/842cappwd = cap_clone(origcappwd);843CHECK(cappwd != NULL);844845cmds[0] = "setpwent";846cmds[1] = "getpwent";847cmds[2] = "getpwent_r";848cmds[3] = "getpwnam";849cmds[4] = "getpwnam_r";850cmds[5] = "getpwuid";851CHECK(cap_pwd_limit_cmds(cappwd, cmds, 6) == 0);852cmds[0] = "setpwent";853cmds[1] = "getpwent";854cmds[2] = "getpwent_r";855cmds[3] = "getpwnam";856cmds[4] = "getpwnam_r";857cmds[5] = "getpwuid";858cmds[6] = "getpwuid_r";859CHECK(cap_pwd_limit_cmds(cappwd, cmds, 7) == -1 && errno == ENOTCAPABLE);860cmds[0] = "getpwuid_r";861CHECK(cap_pwd_limit_cmds(cappwd, cmds, 1) == -1 && errno == ENOTCAPABLE);862CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);863CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 5) == 0);864865CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R |866GETPWNAM | GETPWNAM_R | GETPWUID));867868cap_close(cappwd);869}870871#define PW_NAME _PWF_NAME872#define PW_PASSWD _PWF_PASSWD873#define PW_UID _PWF_UID874#define PW_GID _PWF_GID875#define PW_CHANGE _PWF_CHANGE876#define PW_CLASS _PWF_CLASS877#define PW_GECOS _PWF_GECOS878#define PW_DIR _PWF_DIR879#define PW_SHELL _PWF_SHELL880#define PW_EXPIRE _PWF_EXPIRE881882static unsigned int883passwd_fields(const struct passwd *pwd)884{885unsigned int result;886887result = 0;888889if (pwd->pw_name != NULL && pwd->pw_name[0] != '\0')890result |= PW_NAME;891// else892// printf("No pw_name\n");893894if (pwd->pw_passwd != NULL && pwd->pw_passwd[0] != '\0')895result |= PW_PASSWD;896else if ((pwd->pw_fields & _PWF_PASSWD) != 0)897result |= PW_PASSWD;898// else899// printf("No pw_passwd\n");900901if (pwd->pw_uid != (uid_t)-1)902result |= PW_UID;903// else904// printf("No pw_uid\n");905906if (pwd->pw_gid != (gid_t)-1)907result |= PW_GID;908// else909// printf("No pw_gid\n");910911if (pwd->pw_change != 0 || (pwd->pw_fields & _PWF_CHANGE) != 0)912result |= PW_CHANGE;913// else914// printf("No pw_change\n");915916if (pwd->pw_class != NULL && pwd->pw_class[0] != '\0')917result |= PW_CLASS;918else if ((pwd->pw_fields & _PWF_CLASS) != 0)919result |= PW_CLASS;920// else921// printf("No pw_class\n");922923if (pwd->pw_gecos != NULL && pwd->pw_gecos[0] != '\0')924result |= PW_GECOS;925else if ((pwd->pw_fields & _PWF_GECOS) != 0)926result |= PW_GECOS;927// else928// printf("No pw_gecos\n");929930if (pwd->pw_dir != NULL && pwd->pw_dir[0] != '\0')931result |= PW_DIR;932else if ((pwd->pw_fields & _PWF_DIR) != 0)933result |= PW_DIR;934// else935// printf("No pw_dir\n");936937if (pwd->pw_shell != NULL && pwd->pw_shell[0] != '\0')938result |= PW_SHELL;939else if ((pwd->pw_fields & _PWF_SHELL) != 0)940result |= PW_SHELL;941// else942// printf("No pw_shell\n");943944if (pwd->pw_expire != 0 || (pwd->pw_fields & _PWF_EXPIRE) != 0)945result |= PW_EXPIRE;946// else947// printf("No pw_expire\n");948949if (false && pwd->pw_fields != (int)result) {950printf("fields=0x%x != result=0x%x\n", (const unsigned int)pwd->pw_fields, result);951printf(" fields result\n");952printf("PW_NAME %d %d\n", (pwd->pw_fields & PW_NAME) != 0, (result & PW_NAME) != 0);953printf("PW_PASSWD %d %d\n", (pwd->pw_fields & PW_PASSWD) != 0, (result & PW_PASSWD) != 0);954printf("PW_UID %d %d\n", (pwd->pw_fields & PW_UID) != 0, (result & PW_UID) != 0);955printf("PW_GID %d %d\n", (pwd->pw_fields & PW_GID) != 0, (result & PW_GID) != 0);956printf("PW_CHANGE %d %d\n", (pwd->pw_fields & PW_CHANGE) != 0, (result & PW_CHANGE) != 0);957printf("PW_CLASS %d %d\n", (pwd->pw_fields & PW_CLASS) != 0, (result & PW_CLASS) != 0);958printf("PW_GECOS %d %d\n", (pwd->pw_fields & PW_GECOS) != 0, (result & PW_GECOS) != 0);959printf("PW_DIR %d %d\n", (pwd->pw_fields & PW_DIR) != 0, (result & PW_DIR) != 0);960printf("PW_SHELL %d %d\n", (pwd->pw_fields & PW_SHELL) != 0, (result & PW_SHELL) != 0);961printf("PW_EXPIRE %d %d\n", (pwd->pw_fields & PW_EXPIRE) != 0, (result & PW_EXPIRE) != 0);962}963964//printf("result=0x%x\n", result);965return (result);966}967968static bool969runtest_fields(cap_channel_t *cappwd, unsigned int expected)970{971char buf[1024];972struct passwd *pwd;973struct passwd st;974975//printf("expected=0x%x\n", expected);976cap_setpwent(cappwd);977pwd = cap_getpwent(cappwd);978if ((passwd_fields(pwd) & ~expected) != 0)979return (false);980981cap_setpwent(cappwd);982cap_getpwent_r(cappwd, &st, buf, sizeof(buf), &pwd);983if ((passwd_fields(pwd) & ~expected) != 0)984return (false);985986pwd = cap_getpwnam(cappwd, "root");987if ((passwd_fields(pwd) & ~expected) != 0)988return (false);989990cap_getpwnam_r(cappwd, "root", &st, buf, sizeof(buf), &pwd);991if ((passwd_fields(pwd) & ~expected) != 0)992return (false);993994pwd = cap_getpwuid(cappwd, UID_ROOT);995if ((passwd_fields(pwd) & ~expected) != 0)996return (false);997998cap_getpwuid_r(cappwd, UID_ROOT, &st, buf, sizeof(buf), &pwd);999if ((passwd_fields(pwd) & ~expected) != 0)1000return (false);10011002return (true);1003}10041005static void1006test_fields(cap_channel_t *origcappwd)1007{1008cap_channel_t *cappwd;1009const char *fields[10];10101011/* No limits. */10121013CHECK(runtest_fields(origcappwd, PW_NAME | PW_PASSWD | PW_UID |1014PW_GID | PW_CHANGE | PW_CLASS | PW_GECOS | PW_DIR | PW_SHELL |1015PW_EXPIRE));10161017/*1018* Allow:1019* fields: pw_name, pw_passwd, pw_uid, pw_gid, pw_change, pw_class,1020* pw_gecos, pw_dir, pw_shell, pw_expire1021*/1022cappwd = cap_clone(origcappwd);1023CHECK(cappwd != NULL);10241025fields[0] = "pw_name";1026fields[1] = "pw_passwd";1027fields[2] = "pw_uid";1028fields[3] = "pw_gid";1029fields[4] = "pw_change";1030fields[5] = "pw_class";1031fields[6] = "pw_gecos";1032fields[7] = "pw_dir";1033fields[8] = "pw_shell";1034fields[9] = "pw_expire";1035CHECK(cap_pwd_limit_fields(cappwd, fields, 10) == 0);10361037CHECK(runtest_fields(origcappwd, PW_NAME | PW_PASSWD | PW_UID |1038PW_GID | PW_CHANGE | PW_CLASS | PW_GECOS | PW_DIR | PW_SHELL |1039PW_EXPIRE));10401041cap_close(cappwd);10421043/*1044* Allow:1045* fields: pw_name, pw_passwd, pw_uid, pw_gid, pw_change1046*/1047cappwd = cap_clone(origcappwd);1048CHECK(cappwd != NULL);10491050fields[0] = "pw_name";1051fields[1] = "pw_passwd";1052fields[2] = "pw_uid";1053fields[3] = "pw_gid";1054fields[4] = "pw_change";1055CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0);1056fields[5] = "pw_class";1057CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 &&1058errno == ENOTCAPABLE);1059fields[0] = "pw_class";1060CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 &&1061errno == ENOTCAPABLE);10621063CHECK(runtest_fields(cappwd, PW_NAME | PW_PASSWD | PW_UID |1064PW_GID | PW_CHANGE));10651066cap_close(cappwd);10671068/*1069* Allow:1070* fields: pw_class, pw_gecos, pw_dir, pw_shell, pw_expire1071*/1072cappwd = cap_clone(origcappwd);1073CHECK(cappwd != NULL);10741075fields[0] = "pw_class";1076fields[1] = "pw_gecos";1077fields[2] = "pw_dir";1078fields[3] = "pw_shell";1079fields[4] = "pw_expire";1080CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0);1081fields[5] = "pw_uid";1082CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 &&1083errno == ENOTCAPABLE);1084fields[0] = "pw_uid";1085CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 &&1086errno == ENOTCAPABLE);10871088CHECK(runtest_fields(cappwd, PW_CLASS | PW_GECOS | PW_DIR |1089PW_SHELL | PW_EXPIRE));10901091cap_close(cappwd);10921093/*1094* Allow:1095* fields: pw_name, pw_uid, pw_change, pw_gecos, pw_shell1096*/1097cappwd = cap_clone(origcappwd);1098CHECK(cappwd != NULL);10991100fields[0] = "pw_name";1101fields[1] = "pw_uid";1102fields[2] = "pw_change";1103fields[3] = "pw_gecos";1104fields[4] = "pw_shell";1105CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0);1106fields[5] = "pw_class";1107CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 &&1108errno == ENOTCAPABLE);1109fields[0] = "pw_class";1110CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 &&1111errno == ENOTCAPABLE);11121113CHECK(runtest_fields(cappwd, PW_NAME | PW_UID | PW_CHANGE |1114PW_GECOS | PW_SHELL));11151116cap_close(cappwd);11171118/*1119* Allow:1120* fields: pw_passwd, pw_gid, pw_class, pw_dir, pw_expire1121*/1122cappwd = cap_clone(origcappwd);1123CHECK(cappwd != NULL);11241125fields[0] = "pw_passwd";1126fields[1] = "pw_gid";1127fields[2] = "pw_class";1128fields[3] = "pw_dir";1129fields[4] = "pw_expire";1130CHECK(cap_pwd_limit_fields(cappwd, fields, 5) == 0);1131fields[5] = "pw_uid";1132CHECK(cap_pwd_limit_fields(cappwd, fields, 6) == -1 &&1133errno == ENOTCAPABLE);1134fields[0] = "pw_uid";1135CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 &&1136errno == ENOTCAPABLE);11371138CHECK(runtest_fields(cappwd, PW_PASSWD | PW_GID | PW_CLASS |1139PW_DIR | PW_EXPIRE));11401141cap_close(cappwd);11421143/*1144* Allow:1145* fields: pw_uid, pw_class, pw_shell1146*/1147cappwd = cap_clone(origcappwd);1148CHECK(cappwd != NULL);11491150fields[0] = "pw_uid";1151fields[1] = "pw_class";1152fields[2] = "pw_shell";1153CHECK(cap_pwd_limit_fields(cappwd, fields, 3) == 0);1154fields[3] = "pw_change";1155CHECK(cap_pwd_limit_fields(cappwd, fields, 4) == -1 &&1156errno == ENOTCAPABLE);1157fields[0] = "pw_change";1158CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 &&1159errno == ENOTCAPABLE);11601161CHECK(runtest_fields(cappwd, PW_UID | PW_CLASS | PW_SHELL));11621163cap_close(cappwd);11641165/*1166* Allow:1167* fields: pw_change1168*/1169cappwd = cap_clone(origcappwd);1170CHECK(cappwd != NULL);11711172fields[0] = "pw_change";1173CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == 0);1174fields[1] = "pw_uid";1175CHECK(cap_pwd_limit_fields(cappwd, fields, 2) == -1 &&1176errno == ENOTCAPABLE);1177fields[0] = "pw_uid";1178CHECK(cap_pwd_limit_fields(cappwd, fields, 1) == -1 &&1179errno == ENOTCAPABLE);11801181CHECK(runtest_fields(cappwd, PW_CHANGE));11821183cap_close(cappwd);1184}11851186static bool1187runtest_users(cap_channel_t *cappwd, const char **names, const uid_t *uids,1188size_t nusers)1189{1190char buf[1024];1191struct passwd *pwd;1192struct passwd st;1193unsigned int i, got;11941195cap_setpwent(cappwd);1196got = 0;1197for (;;) {1198pwd = cap_getpwent(cappwd);1199if (pwd == NULL)1200break;1201got++;1202for (i = 0; i < nusers; i++) {1203if (strcmp(names[i], pwd->pw_name) == 0 &&1204uids[i] == pwd->pw_uid) {1205break;1206}1207}1208if (i == nusers)1209return (false);1210}1211if (got != nusers)1212return (false);12131214cap_setpwent(cappwd);1215got = 0;1216for (;;) {1217cap_getpwent_r(cappwd, &st, buf, sizeof(buf), &pwd);1218if (pwd == NULL)1219break;1220got++;1221for (i = 0; i < nusers; i++) {1222if (strcmp(names[i], pwd->pw_name) == 0 &&1223uids[i] == pwd->pw_uid) {1224break;1225}1226}1227if (i == nusers)1228return (false);1229}1230if (got != nusers)1231return (false);12321233for (i = 0; i < nusers; i++) {1234pwd = cap_getpwnam(cappwd, names[i]);1235if (pwd == NULL)1236return (false);1237}12381239for (i = 0; i < nusers; i++) {1240cap_getpwnam_r(cappwd, names[i], &st, buf, sizeof(buf), &pwd);1241if (pwd == NULL)1242return (false);1243}12441245for (i = 0; i < nusers; i++) {1246pwd = cap_getpwuid(cappwd, uids[i]);1247if (pwd == NULL)1248return (false);1249}12501251for (i = 0; i < nusers; i++) {1252cap_getpwuid_r(cappwd, uids[i], &st, buf, sizeof(buf), &pwd);1253if (pwd == NULL)1254return (false);1255}12561257return (true);1258}12591260static void1261test_users(cap_channel_t *origcappwd)1262{1263cap_channel_t *cappwd;1264const char *names[6];1265uid_t uids[6];12661267/*1268* Allow:1269* users:1270* names: root, toor, daemon, operator, bin, tty1271* uids:1272*/1273cappwd = cap_clone(origcappwd);1274CHECK(cappwd != NULL);12751276names[0] = "root";1277names[1] = "toor";1278names[2] = "daemon";1279names[3] = "operator";1280names[4] = "bin";1281names[5] = "tty";1282CHECK(cap_pwd_limit_users(cappwd, names, 6, NULL, 0) == 0);1283uids[0] = 0;1284uids[1] = 0;1285uids[2] = 1;1286uids[3] = 2;1287uids[4] = 3;1288uids[5] = 4;12891290CHECK(runtest_users(cappwd, names, uids, 6));12911292cap_close(cappwd);12931294/*1295* Allow:1296* users:1297* names: daemon, operator, bin1298* uids:1299*/1300cappwd = cap_clone(origcappwd);1301CHECK(cappwd != NULL);13021303names[0] = "daemon";1304names[1] = "operator";1305names[2] = "bin";1306CHECK(cap_pwd_limit_users(cappwd, names, 3, NULL, 0) == 0);1307names[3] = "tty";1308CHECK(cap_pwd_limit_users(cappwd, names, 4, NULL, 0) == -1 &&1309errno == ENOTCAPABLE);1310names[0] = "tty";1311CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 &&1312errno == ENOTCAPABLE);1313names[0] = "daemon";1314uids[0] = 1;1315uids[1] = 2;1316uids[2] = 3;13171318CHECK(runtest_users(cappwd, names, uids, 3));13191320cap_close(cappwd);13211322/*1323* Allow:1324* users:1325* names: daemon, bin, tty1326* uids:1327*/1328cappwd = cap_clone(origcappwd);1329CHECK(cappwd != NULL);13301331names[0] = "daemon";1332names[1] = "bin";1333names[2] = "tty";1334CHECK(cap_pwd_limit_users(cappwd, names, 3, NULL, 0) == 0);1335names[3] = "operator";1336CHECK(cap_pwd_limit_users(cappwd, names, 4, NULL, 0) == -1 &&1337errno == ENOTCAPABLE);1338names[0] = "operator";1339CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 &&1340errno == ENOTCAPABLE);1341names[0] = "daemon";1342uids[0] = 1;1343uids[1] = 3;1344uids[2] = 4;13451346CHECK(runtest_users(cappwd, names, uids, 3));13471348cap_close(cappwd);13491350/*1351* Allow:1352* users:1353* names:1354* uids: 1, 2, 31355*/1356cappwd = cap_clone(origcappwd);1357CHECK(cappwd != NULL);13581359names[0] = "daemon";1360names[1] = "operator";1361names[2] = "bin";1362uids[0] = 1;1363uids[1] = 2;1364uids[2] = 3;1365CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 3) == 0);1366uids[3] = 4;1367CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 4) == -1 &&1368errno == ENOTCAPABLE);1369uids[0] = 4;1370CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 &&1371errno == ENOTCAPABLE);1372uids[0] = 1;13731374CHECK(runtest_users(cappwd, names, uids, 3));13751376cap_close(cappwd);13771378/*1379* Allow:1380* users:1381* names:1382* uids: 1, 3, 41383*/1384cappwd = cap_clone(origcappwd);1385CHECK(cappwd != NULL);13861387names[0] = "daemon";1388names[1] = "bin";1389names[2] = "tty";1390uids[0] = 1;1391uids[1] = 3;1392uids[2] = 4;1393CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 3) == 0);1394uids[3] = 5;1395CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 4) == -1 &&1396errno == ENOTCAPABLE);1397uids[0] = 5;1398CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 &&1399errno == ENOTCAPABLE);1400uids[0] = 1;14011402CHECK(runtest_users(cappwd, names, uids, 3));14031404cap_close(cappwd);14051406/*1407* Allow:1408* users:1409* names: bin1410* uids:1411*/1412cappwd = cap_clone(origcappwd);1413CHECK(cappwd != NULL);14141415names[0] = "bin";1416CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == 0);1417names[1] = "operator";1418CHECK(cap_pwd_limit_users(cappwd, names, 2, NULL, 0) == -1 &&1419errno == ENOTCAPABLE);1420names[0] = "operator";1421CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 &&1422errno == ENOTCAPABLE);1423names[0] = "bin";1424uids[0] = 3;14251426CHECK(runtest_users(cappwd, names, uids, 1));14271428cap_close(cappwd);14291430/*1431* Allow:1432* users:1433* names: daemon, tty1434* uids:1435*/1436cappwd = cap_clone(origcappwd);1437CHECK(cappwd != NULL);14381439names[0] = "daemon";1440names[1] = "tty";1441CHECK(cap_pwd_limit_users(cappwd, names, 2, NULL, 0) == 0);1442names[2] = "operator";1443CHECK(cap_pwd_limit_users(cappwd, names, 3, NULL, 0) == -1 &&1444errno == ENOTCAPABLE);1445names[0] = "operator";1446CHECK(cap_pwd_limit_users(cappwd, names, 1, NULL, 0) == -1 &&1447errno == ENOTCAPABLE);1448names[0] = "daemon";1449uids[0] = 1;1450uids[1] = 4;14511452CHECK(runtest_users(cappwd, names, uids, 2));14531454cap_close(cappwd);14551456/*1457* Allow:1458* users:1459* names:1460* uids: 31461*/1462cappwd = cap_clone(origcappwd);1463CHECK(cappwd != NULL);14641465names[0] = "bin";1466uids[0] = 3;1467CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == 0);1468uids[1] = 4;1469CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 2) == -1 &&1470errno == ENOTCAPABLE);1471uids[0] = 4;1472CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 &&1473errno == ENOTCAPABLE);1474uids[0] = 3;14751476CHECK(runtest_users(cappwd, names, uids, 1));14771478cap_close(cappwd);14791480/*1481* Allow:1482* users:1483* names:1484* uids: 1, 41485*/1486cappwd = cap_clone(origcappwd);1487CHECK(cappwd != NULL);14881489names[0] = "daemon";1490names[1] = "tty";1491uids[0] = 1;1492uids[1] = 4;1493CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 2) == 0);1494uids[2] = 3;1495CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 3) == -1 &&1496errno == ENOTCAPABLE);1497uids[0] = 3;1498CHECK(cap_pwd_limit_users(cappwd, NULL, 0, uids, 1) == -1 &&1499errno == ENOTCAPABLE);1500uids[0] = 1;15011502CHECK(runtest_users(cappwd, names, uids, 2));15031504cap_close(cappwd);1505}15061507int1508main(void)1509{1510cap_channel_t *capcas, *cappwd;15111512printf("1..188\n");1513fflush(stdout);15141515capcas = cap_init();1516CHECKX(capcas != NULL);15171518cappwd = cap_service_open(capcas, "system.pwd");1519CHECKX(cappwd != NULL);15201521cap_close(capcas);15221523/* No limits. */15241525CHECK(runtest_cmds(cappwd) == (GETPWENT | GETPWENT_R | GETPWNAM |1526GETPWNAM_R | GETPWUID | GETPWUID_R));15271528test_cmds(cappwd);15291530test_fields(cappwd);15311532test_users(cappwd);15331534cap_close(cappwd);15351536exit(0);1537}153815391540