| 1038 | } |
| 1039 | |
| 1040 | static int |
| 1041 | sysctl_shmsegs(SYSCTL_HANDLER_ARGS) |
| 1042 | { |
| 1043 | struct shmid_kernel tshmseg; |
| 1044 | #ifdef COMPAT_FREEBSD32 |
| 1045 | struct shmid_kernel32 tshmseg32; |
| 1046 | #endif |
| 1047 | struct prison *pr, *rpr; |
| 1048 | void *outaddr; |
| 1049 | size_t outsize; |
| 1050 | int error, i; |
| 1051 | |
| 1052 | SYSVSHM_LOCK(); |
| 1053 | pr = req->td->td_ucred->cr_prison; |
| 1054 | rpr = shm_find_prison(req->td->td_ucred); |
| 1055 | error = 0; |
| 1056 | for (i = 0; i < shmalloced; i++) { |
| 1057 | if ((shmsegs[i].u.shm_perm.mode & SHMSEG_ALLOCATED) == 0 || |
| 1058 | rpr == NULL || shm_prison_cansee(rpr, &shmsegs[i]) != 0) { |
| 1059 | bzero(&tshmseg, sizeof(tshmseg)); |
| 1060 | tshmseg.u.shm_perm.mode = SHMSEG_FREE; |
| 1061 | } else { |
| 1062 | tshmseg = shmsegs[i]; |
| 1063 | if (tshmseg.cred->cr_prison != pr) |
| 1064 | tshmseg.u.shm_perm.key = IPC_PRIVATE; |
| 1065 | } |
| 1066 | #ifdef COMPAT_FREEBSD32 |
| 1067 | if (SV_CURPROC_FLAG(SV_ILP32)) { |
| 1068 | bzero(&tshmseg32, sizeof(tshmseg32)); |
| 1069 | freebsd32_ipcperm_out(&tshmseg.u.shm_perm, |
| 1070 | &tshmseg32.u.shm_perm); |
| 1071 | CP(tshmseg, tshmseg32, u.shm_segsz); |
| 1072 | CP(tshmseg, tshmseg32, u.shm_lpid); |
| 1073 | CP(tshmseg, tshmseg32, u.shm_cpid); |
| 1074 | CP(tshmseg, tshmseg32, u.shm_nattch); |
| 1075 | CP(tshmseg, tshmseg32, u.shm_atime); |
| 1076 | CP(tshmseg, tshmseg32, u.shm_dtime); |
| 1077 | CP(tshmseg, tshmseg32, u.shm_ctime); |
| 1078 | /* Don't copy object, label, or cred */ |
| 1079 | outaddr = &tshmseg32; |
| 1080 | outsize = sizeof(tshmseg32); |
| 1081 | } else |
| 1082 | #endif |
| 1083 | { |
| 1084 | tshmseg.object = NULL; |
| 1085 | tshmseg.label = NULL; |
| 1086 | tshmseg.cred = NULL; |
| 1087 | outaddr = &tshmseg; |
| 1088 | outsize = sizeof(tshmseg); |
| 1089 | } |
| 1090 | error = SYSCTL_OUT(req, outaddr, outsize); |
| 1091 | if (error != 0) |
| 1092 | break; |
| 1093 | } |
| 1094 | SYSVSHM_UNLOCK(); |
| 1095 | return (error); |
| 1096 | } |
| 1097 |
nothing calls this directly
no test coverage detected