| 1497 | } |
| 1498 | |
| 1499 | static int |
| 1500 | sysctl_sema(SYSCTL_HANDLER_ARGS) |
| 1501 | { |
| 1502 | struct prison *pr, *rpr; |
| 1503 | struct semid_kernel tsemak; |
| 1504 | #ifdef COMPAT_FREEBSD32 |
| 1505 | struct semid_kernel32 tsemak32; |
| 1506 | #endif |
| 1507 | void *outaddr; |
| 1508 | size_t outsize; |
| 1509 | int error, i; |
| 1510 | |
| 1511 | pr = req->td->td_ucred->cr_prison; |
| 1512 | rpr = sem_find_prison(req->td->td_ucred); |
| 1513 | error = 0; |
| 1514 | for (i = 0; i < seminfo.semmni; i++) { |
| 1515 | mtx_lock(&sema_mtx[i]); |
| 1516 | if ((sema[i].u.sem_perm.mode & SEM_ALLOC) == 0 || |
| 1517 | rpr == NULL || sem_prison_cansee(rpr, &sema[i]) != 0) |
| 1518 | bzero(&tsemak, sizeof(tsemak)); |
| 1519 | else { |
| 1520 | tsemak = sema[i]; |
| 1521 | if (tsemak.cred->cr_prison != pr) |
| 1522 | tsemak.u.sem_perm.key = IPC_PRIVATE; |
| 1523 | } |
| 1524 | mtx_unlock(&sema_mtx[i]); |
| 1525 | #ifdef COMPAT_FREEBSD32 |
| 1526 | if (SV_CURPROC_FLAG(SV_ILP32)) { |
| 1527 | bzero(&tsemak32, sizeof(tsemak32)); |
| 1528 | freebsd32_ipcperm_out(&tsemak.u.sem_perm, |
| 1529 | &tsemak32.u.sem_perm); |
| 1530 | /* Don't copy u.__sem_base */ |
| 1531 | CP(tsemak, tsemak32, u.sem_nsems); |
| 1532 | CP(tsemak, tsemak32, u.sem_otime); |
| 1533 | CP(tsemak, tsemak32, u.sem_ctime); |
| 1534 | /* Don't copy label or cred */ |
| 1535 | outaddr = &tsemak32; |
| 1536 | outsize = sizeof(tsemak32); |
| 1537 | } else |
| 1538 | #endif |
| 1539 | { |
| 1540 | tsemak.u.__sem_base = NULL; |
| 1541 | tsemak.label = NULL; |
| 1542 | tsemak.cred = NULL; |
| 1543 | outaddr = &tsemak; |
| 1544 | outsize = sizeof(tsemak); |
| 1545 | } |
| 1546 | error = SYSCTL_OUT(req, outaddr, outsize); |
| 1547 | if (error != 0) |
| 1548 | break; |
| 1549 | } |
| 1550 | return (error); |
| 1551 | } |
| 1552 | |
| 1553 | static int |
| 1554 | sem_prison_check(void *obj, void *data) |
nothing calls this directly
no test coverage detected