2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
12 /* Copyright 2015, Richard Lowe. */
15 #include <sys/errno.h>
16 #include <sys/policy.h>
18 #include <sys/procset.h>
19 #include <sys/systm.h>
20 #include <sys/types.h>
23 psecflagwhich_t which
;
24 const secflagdelta_t
*delta
;
28 secflags_apply_delta(secflagset_t
*set
, const secflagdelta_t
*delta
)
30 if (delta
->psd_ass_active
) {
31 secflags_copy(set
, &delta
->psd_assign
);
33 if (!secflags_isempty(delta
->psd_add
)) {
34 secflags_union(set
, &delta
->psd_add
);
36 if (!secflags_isempty(delta
->psd_rem
)) {
37 secflags_difference(set
, &delta
->psd_rem
);
44 psecdo(proc_t
*p
, struct psdargs
*args
)
49 mutex_enter(&p
->p_lock
);
51 if (secpolicy_psecflags(CRED(), p
, curproc
) != 0) {
56 ASSERT(args
->which
!= PSF_EFFECTIVE
);
58 if (!psecflags_validate_delta(&p
->p_secflags
, args
->delta
)) {
63 switch (args
->which
) {
65 set
= &p
->p_secflags
.psf_inherit
;
68 set
= &p
->p_secflags
.psf_lower
;
71 set
= &p
->p_secflags
.psf_upper
;
75 secflags_apply_delta(set
, args
->delta
);
78 * Add any flag now in the lower that is not in the inheritable.
80 secflags_union(&p
->p_secflags
.psf_inherit
, &p
->p_secflags
.psf_lower
);
83 mutex_exit(&p
->p_lock
);
88 psecflags(procset_t
*psp
, psecflagwhich_t which
, secflagdelta_t
*ap
)
93 struct psdargs psd
= {
97 /* Can never change the effective flags */
98 if (psd
.which
== PSF_EFFECTIVE
)
101 if (copyin(psp
, &procset
, sizeof (procset
)) != 0)
102 return (set_errno(EFAULT
));
104 if (copyin(ap
, &args
, sizeof (secflagdelta_t
)) != 0)
105 return (set_errno(EFAULT
));
109 /* secflags are per-process, procset must be in terms of processes */
110 if ((procset
.p_lidtype
== P_LWPID
) ||
111 (procset
.p_ridtype
== P_LWPID
))
112 return (set_errno(EINVAL
));
114 rv
= dotoprocs(&procset
, psecdo
, (caddr_t
)&psd
);
116 return (rv
? set_errno(rv
) : 0);