| 924 | #endif |
| 925 | |
| 926 | static int |
| 927 | shminit(void) |
| 928 | { |
| 929 | struct prison *pr; |
| 930 | void **rsv; |
| 931 | int i, error; |
| 932 | osd_method_t methods[PR_MAXMETHOD] = { |
| 933 | [PR_METHOD_CHECK] = shm_prison_check, |
| 934 | [PR_METHOD_SET] = shm_prison_set, |
| 935 | [PR_METHOD_GET] = shm_prison_get, |
| 936 | [PR_METHOD_REMOVE] = shm_prison_remove, |
| 937 | }; |
| 938 | |
| 939 | #ifndef BURN_BRIDGES |
| 940 | if (TUNABLE_ULONG_FETCH("kern.ipc.shmmaxpgs", &shminfo.shmall) != 0) |
| 941 | printf("kern.ipc.shmmaxpgs is now called kern.ipc.shmall!\n"); |
| 942 | #endif |
| 943 | if (shminfo.shmmax == SHMMAX) { |
| 944 | /* Initialize shmmax dealing with possible overflow. */ |
| 945 | for (i = PAGE_SIZE; i != 0; i--) { |
| 946 | shminfo.shmmax = shminfo.shmall * i; |
| 947 | if ((shminfo.shmmax / shminfo.shmall) == (u_long)i) |
| 948 | break; |
| 949 | } |
| 950 | } |
| 951 | shmalloced = shminfo.shmmni; |
| 952 | shmsegs = malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, |
| 953 | M_WAITOK|M_ZERO); |
| 954 | for (i = 0; i < shmalloced; i++) { |
| 955 | shmsegs[i].u.shm_perm.mode = SHMSEG_FREE; |
| 956 | shmsegs[i].u.shm_perm.seq = 0; |
| 957 | #ifdef MAC |
| 958 | mac_sysvshm_init(&shmsegs[i]); |
| 959 | #endif |
| 960 | } |
| 961 | shm_last_free = 0; |
| 962 | shm_nused = 0; |
| 963 | shm_committed = 0; |
| 964 | sx_init(&sysvshmsx, "sysvshmsx"); |
| 965 | #ifndef SYSVSHM |
| 966 | shmexit_hook = &shmexit_myhook; |
| 967 | shmfork_hook = &shmfork_myhook; |
| 968 | #endif |
| 969 | |
| 970 | /* Set current prisons according to their allow.sysvipc. */ |
| 971 | shm_prison_slot = osd_jail_register(NULL, methods); |
| 972 | rsv = osd_reserve(shm_prison_slot); |
| 973 | prison_lock(&prison0); |
| 974 | (void)osd_jail_set_reserved(&prison0, shm_prison_slot, rsv, &prison0); |
| 975 | prison_unlock(&prison0); |
| 976 | rsv = NULL; |
| 977 | sx_slock(&allprison_lock); |
| 978 | TAILQ_FOREACH(pr, &allprison, pr_list) { |
| 979 | if (rsv == NULL) |
| 980 | rsv = osd_reserve(shm_prison_slot); |
| 981 | prison_lock(pr); |
| 982 | if (prison_isvalid(pr) && (pr->pr_allow & PR_ALLOW_SYSVIPC)) { |
| 983 | (void)osd_jail_set_reserved(pr, shm_prison_slot, rsv, |
no test coverage detected