MCPcopy Create free account
hub / github.com/F-Stack/f-stack / sem_prison_set

Function sem_prison_set

freebsd/kern/sysv_sem.c:1588–1673  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1586}
1587
1588static int
1589sem_prison_set(void *obj, void *data)
1590{
1591 struct prison *pr = obj;
1592 struct prison *tpr, *orpr, *nrpr, *trpr;
1593 struct vfsoptlist *opts = data;
1594 void *rsv;
1595 int jsys, descend;
1596
1597 /*
1598 * sysvsem controls which jail is the root of the associated sems (this
1599 * jail or same as the parent), or if the feature is available at all.
1600 */
1601 if (vfs_copyopt(opts, "sysvsem", &jsys, sizeof(jsys)) == ENOENT)
1602 jsys = vfs_flagopt(opts, "allow.sysvipc", NULL, 0)
1603 ? JAIL_SYS_INHERIT
1604 : vfs_flagopt(opts, "allow.nosysvipc", NULL, 0)
1605 ? JAIL_SYS_DISABLE
1606 : -1;
1607 if (jsys == JAIL_SYS_DISABLE) {
1608 prison_lock(pr);
1609 orpr = osd_jail_get(pr, sem_prison_slot);
1610 if (orpr != NULL)
1611 osd_jail_del(pr, sem_prison_slot);
1612 prison_unlock(pr);
1613 if (orpr != NULL) {
1614 if (orpr == pr)
1615 sem_prison_cleanup(pr);
1616 /* Disable all child jails as well. */
1617 FOREACH_PRISON_DESCENDANT(pr, tpr, descend) {
1618 prison_lock(tpr);
1619 trpr = osd_jail_get(tpr, sem_prison_slot);
1620 if (trpr != NULL) {
1621 osd_jail_del(tpr, sem_prison_slot);
1622 prison_unlock(tpr);
1623 if (trpr == tpr)
1624 sem_prison_cleanup(tpr);
1625 } else {
1626 prison_unlock(tpr);
1627 descend = 0;
1628 }
1629 }
1630 }
1631 } else if (jsys != -1) {
1632 if (jsys == JAIL_SYS_NEW)
1633 nrpr = pr;
1634 else {
1635 prison_lock(pr->pr_parent);
1636 nrpr = osd_jail_get(pr->pr_parent, sem_prison_slot);
1637 prison_unlock(pr->pr_parent);
1638 }
1639 rsv = osd_reserve(sem_prison_slot);
1640 prison_lock(pr);
1641 orpr = osd_jail_get(pr, sem_prison_slot);
1642 if (orpr != nrpr)
1643 (void)osd_jail_set_reserved(pr, sem_prison_slot, rsv,
1644 nrpr);
1645 else

Callers

nothing calls this directly

Calls 7

vfs_copyoptFunction · 0.85
vfs_flagoptFunction · 0.85
prison_lockFunction · 0.85
prison_unlockFunction · 0.85
sem_prison_cleanupFunction · 0.85
osd_reserveFunction · 0.85
osd_free_reservedFunction · 0.85

Tested by

no test coverage detected