Skip to content

Commit

Permalink
Solaris: prefer PRIV_XPOLICY to PRIV_LIMIT
Browse files Browse the repository at this point in the history
If the system support PRIV_XPOLICY and one is set, then don't
modify PRIV_LIMIT. bz2833, patch from Ron Jordan, ok dtucker@
  • Loading branch information
djmdjm committed Oct 12, 2023
1 parent 98fc34d commit 281c791
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion openbsd-compat/port-solaris.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,35 @@ solaris_drop_privs_pinfo_net_fork_exec(void)
priv_delset(npset, PRIV_PROC_SESSION) != 0)
fatal("priv_delset: %s", strerror(errno));

#ifdef PRIV_XPOLICY
/*
* It is possible that the user has an extended policy
* in place; the LIMIT set restricts the extended policy
* and so should not be restricted.
* PRIV_XPOLICY is newly defined in Solaris 11 though the extended
* policy was not implemented until Solaris 11.1.
*/
if (getpflags(PRIV_XPOLICY) == 1) {
if (getppriv(PRIV_LIMIT, pset) != 0)
fatal("getppriv: %s", strerror(errno));
priv_intersect(pset, npset);
if (setppriv(PRIV_SET, PRIV_LIMIT, npset) != 0)
fatal("setppriv: %s", strerror(errno));
} else
#endif
{
/* Cannot exec, so we can kill the limit set. */
priv_emptyset(pset);
if (setppriv(PRIV_SET, PRIV_LIMIT, pset) != 0)
fatal("setppriv: %s", strerror(errno));
}

if (getppriv(PRIV_PERMITTED, pset) != 0)
fatal("getppriv: %s", strerror(errno));

priv_intersect(pset, npset);

if (setppriv(PRIV_SET, PRIV_PERMITTED, npset) != 0 ||
setppriv(PRIV_SET, PRIV_LIMIT, npset) != 0 ||
setppriv(PRIV_SET, PRIV_INHERITABLE, npset) != 0)
fatal("setppriv: %s", strerror(errno));

Expand Down

0 comments on commit 281c791

Please sign in to comment.