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

Function sysctl_sema

freebsd/kern/sysv_sem.c:1499–1551  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1497}
1498
1499static int
1500sysctl_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
1553static int
1554sem_prison_check(void *obj, void *data)

Callers

nothing calls this directly

Calls 6

sem_find_prisonFunction · 0.85
sem_prison_canseeFunction · 0.85
bzeroFunction · 0.85
freebsd32_ipcperm_outFunction · 0.85
mtx_lockFunction · 0.70
mtx_unlockFunction · 0.70

Tested by

no test coverage detected