| 1414 | } |
| 1415 | |
| 1416 | static int |
| 1417 | sysctl_msqids(SYSCTL_HANDLER_ARGS) |
| 1418 | { |
| 1419 | struct msqid_kernel tmsqk; |
| 1420 | #ifdef COMPAT_FREEBSD32 |
| 1421 | struct msqid_kernel32 tmsqk32; |
| 1422 | #endif |
| 1423 | struct prison *pr, *rpr; |
| 1424 | void *outaddr; |
| 1425 | size_t outsize; |
| 1426 | int error, i; |
| 1427 | |
| 1428 | pr = req->td->td_ucred->cr_prison; |
| 1429 | rpr = msg_find_prison(req->td->td_ucred); |
| 1430 | error = 0; |
| 1431 | for (i = 0; i < msginfo.msgmni; i++) { |
| 1432 | mtx_lock(&msq_mtx); |
| 1433 | if (msqids[i].u.msg_qbytes == 0 || rpr == NULL || |
| 1434 | msq_prison_cansee(rpr, &msqids[i]) != 0) |
| 1435 | bzero(&tmsqk, sizeof(tmsqk)); |
| 1436 | else { |
| 1437 | tmsqk = msqids[i]; |
| 1438 | if (tmsqk.cred->cr_prison != pr) |
| 1439 | tmsqk.u.msg_perm.key = IPC_PRIVATE; |
| 1440 | } |
| 1441 | mtx_unlock(&msq_mtx); |
| 1442 | #ifdef COMPAT_FREEBSD32 |
| 1443 | if (SV_CURPROC_FLAG(SV_ILP32)) { |
| 1444 | bzero(&tmsqk32, sizeof(tmsqk32)); |
| 1445 | freebsd32_ipcperm_out(&tmsqk.u.msg_perm, |
| 1446 | &tmsqk32.u.msg_perm); |
| 1447 | /* Don't copy u.msg_first or u.msg_last */ |
| 1448 | CP(tmsqk, tmsqk32, u.msg_cbytes); |
| 1449 | CP(tmsqk, tmsqk32, u.msg_qnum); |
| 1450 | CP(tmsqk, tmsqk32, u.msg_qbytes); |
| 1451 | CP(tmsqk, tmsqk32, u.msg_lspid); |
| 1452 | CP(tmsqk, tmsqk32, u.msg_lrpid); |
| 1453 | CP(tmsqk, tmsqk32, u.msg_stime); |
| 1454 | CP(tmsqk, tmsqk32, u.msg_rtime); |
| 1455 | CP(tmsqk, tmsqk32, u.msg_ctime); |
| 1456 | /* Don't copy label or cred */ |
| 1457 | outaddr = &tmsqk32; |
| 1458 | outsize = sizeof(tmsqk32); |
| 1459 | } else |
| 1460 | #endif |
| 1461 | { |
| 1462 | /* Don't leak kernel pointers */ |
| 1463 | tmsqk.u.__msg_first = NULL; |
| 1464 | tmsqk.u.__msg_last = NULL; |
| 1465 | tmsqk.label = NULL; |
| 1466 | tmsqk.cred = NULL; |
| 1467 | /* |
| 1468 | * XXX: some padding also exists, but we take care to |
| 1469 | * allocate our pool of msqid_kernel structs with |
| 1470 | * zeroed memory so this should be OK. |
| 1471 | */ |
| 1472 | outaddr = &tmsqk; |
| 1473 | outsize = sizeof(tmsqk); |
nothing calls this directly
no test coverage detected