1*892cfbfdSblambert /* $OpenBSD: setuid_regress.h,v 1.1 2014/08/27 07:36:14 blambert Exp $ */
2*892cfbfdSblambert /*
3*892cfbfdSblambert * Written by Bret Stephen Lambert <blambert@openbsd.org> 2014
4*892cfbfdSblambert * Public Domain.
5*892cfbfdSblambert */
6*892cfbfdSblambert
7*892cfbfdSblambert #ifndef _SETUID_REGRESS_H_
8*892cfbfdSblambert #define _SETUID_REGRESS_H_
9*892cfbfdSblambert
10*892cfbfdSblambert #define _SETUID_REGRESS_USER "nobody"
11*892cfbfdSblambert
12*892cfbfdSblambert static inline int
read_kproc_pid(struct kinfo_proc * kproc,pid_t pid)13*892cfbfdSblambert read_kproc_pid(struct kinfo_proc *kproc, pid_t pid)
14*892cfbfdSblambert {
15*892cfbfdSblambert int args[6];
16*892cfbfdSblambert size_t size;
17*892cfbfdSblambert
18*892cfbfdSblambert args[0] = CTL_KERN;
19*892cfbfdSblambert args[1] = KERN_PROC;
20*892cfbfdSblambert args[2] = KERN_PROC_PID;
21*892cfbfdSblambert args[3] = pid;
22*892cfbfdSblambert args[4] = sizeof(*kproc);
23*892cfbfdSblambert args[5] = 1;
24*892cfbfdSblambert
25*892cfbfdSblambert size = sizeof(*kproc);
26*892cfbfdSblambert return (sysctl(args, 6, kproc, &size, NULL, 0));
27*892cfbfdSblambert }
28*892cfbfdSblambert
29*892cfbfdSblambert static inline void
checkuids(uid_t truid,uid_t teuid,uid_t tsuid,const char * str)30*892cfbfdSblambert checkuids(uid_t truid, uid_t teuid, uid_t tsuid, const char *str)
31*892cfbfdSblambert {
32*892cfbfdSblambert uid_t ruid, euid, suid;
33*892cfbfdSblambert
34*892cfbfdSblambert if (getresuid(&ruid, &euid, &suid) == -1)
35*892cfbfdSblambert err(1, "getresuid %s", str);
36*892cfbfdSblambert
37*892cfbfdSblambert if (ruid != truid)
38*892cfbfdSblambert errx(1, "real uid incorrectly set %s: is %u should be %u",
39*892cfbfdSblambert str, ruid, truid);
40*892cfbfdSblambert if (euid != teuid)
41*892cfbfdSblambert errx(1, "effective uid incorrectly set %s: is %u should be %u",
42*892cfbfdSblambert str, euid, teuid);
43*892cfbfdSblambert if (suid != tsuid)
44*892cfbfdSblambert errx(1, "saved uid incorrectly set %s: is %u should be %u",
45*892cfbfdSblambert str, suid, tsuid);
46*892cfbfdSblambert }
47*892cfbfdSblambert
48*892cfbfdSblambert void
checkgids(gid_t trgid,gid_t tegid,gid_t tsgid,const char * str)49*892cfbfdSblambert checkgids(gid_t trgid, gid_t tegid, gid_t tsgid, const char *str)
50*892cfbfdSblambert {
51*892cfbfdSblambert gid_t rgid, egid, sgid;
52*892cfbfdSblambert
53*892cfbfdSblambert if (getresgid(&rgid, &egid, &sgid) == -1)
54*892cfbfdSblambert err(1, "getresgid %s", str);
55*892cfbfdSblambert
56*892cfbfdSblambert if (rgid != trgid)
57*892cfbfdSblambert errx(1, "real gid incorrectly set %s: is %u should be %u",
58*892cfbfdSblambert str, rgid, trgid);
59*892cfbfdSblambert if (egid != tegid)
60*892cfbfdSblambert errx(1, "effective gid incorrectly set %s: is %u should be %u",
61*892cfbfdSblambert str, egid, tegid);
62*892cfbfdSblambert if (sgid != tsgid)
63*892cfbfdSblambert errx(1, "saved gid incorrectly set %s: is %u should be %u",
64*892cfbfdSblambert str, sgid, tsgid);
65*892cfbfdSblambert }
66*892cfbfdSblambert #endif
67