| 1586 | } |
| 1587 | |
| 1588 | static int |
| 1589 | sem_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 |
nothing calls this directly
no test coverage detected