Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/sysv_shm.c
Show First 20 Lines • Show All 860 Lines • ▼ Show 20 Lines | shmrealloc(void) | ||||
struct shmid_kernel *newsegs; | struct shmid_kernel *newsegs; | ||||
int i; | int i; | ||||
SYSVSHM_ASSERT_LOCKED(); | SYSVSHM_ASSERT_LOCKED(); | ||||
if (shmalloced >= shminfo.shmmni) | if (shmalloced >= shminfo.shmmni) | ||||
return; | return; | ||||
newsegs = malloc(shminfo.shmmni * sizeof(*newsegs), M_SHM, M_WAITOK); | newsegs = malloc(shminfo.shmmni * sizeof(*newsegs), M_SHM, | ||||
M_WAITOK | M_ZERO); | |||||
for (i = 0; i < shmalloced; i++) | for (i = 0; i < shmalloced; i++) | ||||
bcopy(&shmsegs[i], &newsegs[i], sizeof(newsegs[0])); | bcopy(&shmsegs[i], &newsegs[i], sizeof(newsegs[0])); | ||||
for (; i < shminfo.shmmni; i++) { | for (; i < shminfo.shmmni; i++) { | ||||
newsegs[i].u.shm_perm.mode = SHMSEG_FREE; | newsegs[i].u.shm_perm.mode = SHMSEG_FREE; | ||||
newsegs[i].u.shm_perm.seq = 0; | newsegs[i].u.shm_perm.seq = 0; | ||||
#ifdef MAC | #ifdef MAC | ||||
mac_sysvshm_init(&newsegs[i]); | mac_sysvshm_init(&newsegs[i]); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | if (shminfo.shmmax == SHMMAX) { | ||||
/* Initialize shmmax dealing with possible overflow. */ | /* Initialize shmmax dealing with possible overflow. */ | ||||
for (i = PAGE_SIZE; i != 0; i--) { | for (i = PAGE_SIZE; i != 0; i--) { | ||||
shminfo.shmmax = shminfo.shmall * i; | shminfo.shmmax = shminfo.shmall * i; | ||||
if ((shminfo.shmmax / shminfo.shmall) == (u_long)i) | if ((shminfo.shmmax / shminfo.shmall) == (u_long)i) | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
shmalloced = shminfo.shmmni; | shmalloced = shminfo.shmmni; | ||||
shmsegs = malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, M_WAITOK); | shmsegs = malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, | ||||
M_WAITOK|M_ZERO); | |||||
for (i = 0; i < shmalloced; i++) { | for (i = 0; i < shmalloced; i++) { | ||||
shmsegs[i].u.shm_perm.mode = SHMSEG_FREE; | shmsegs[i].u.shm_perm.mode = SHMSEG_FREE; | ||||
shmsegs[i].u.shm_perm.seq = 0; | shmsegs[i].u.shm_perm.seq = 0; | ||||
#ifdef MAC | #ifdef MAC | ||||
mac_sysvshm_init(&shmsegs[i]); | mac_sysvshm_init(&shmsegs[i]); | ||||
#endif | #endif | ||||
} | } | ||||
shm_last_free = 0; | shm_last_free = 0; | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | #endif | ||||
sx_destroy(&sysvshmsx); | sx_destroy(&sysvshmsx); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
sysctl_shmsegs(SYSCTL_HANDLER_ARGS) | sysctl_shmsegs(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct shmid_kernel tshmseg; | struct shmid_kernel tshmseg; | ||||
#ifdef COMPAT_FREEBSD32 | |||||
struct shmid_kernel32 tshmseg32; | |||||
#endif | |||||
struct prison *pr, *rpr; | struct prison *pr, *rpr; | ||||
void *outaddr; | |||||
size_t outsize; | |||||
int error, i; | int error, i; | ||||
SYSVSHM_LOCK(); | SYSVSHM_LOCK(); | ||||
pr = req->td->td_ucred->cr_prison; | pr = req->td->td_ucred->cr_prison; | ||||
rpr = shm_find_prison(req->td->td_ucred); | rpr = shm_find_prison(req->td->td_ucred); | ||||
error = 0; | error = 0; | ||||
for (i = 0; i < shmalloced; i++) { | for (i = 0; i < shmalloced; i++) { | ||||
if ((shmsegs[i].u.shm_perm.mode & SHMSEG_ALLOCATED) == 0 || | if ((shmsegs[i].u.shm_perm.mode & SHMSEG_ALLOCATED) == 0 || | ||||
rpr == NULL || shm_prison_cansee(rpr, &shmsegs[i]) != 0) { | rpr == NULL || shm_prison_cansee(rpr, &shmsegs[i]) != 0) { | ||||
bzero(&tshmseg, sizeof(tshmseg)); | bzero(&tshmseg, sizeof(tshmseg)); | ||||
tshmseg.u.shm_perm.mode = SHMSEG_FREE; | tshmseg.u.shm_perm.mode = SHMSEG_FREE; | ||||
} else { | } else { | ||||
tshmseg = shmsegs[i]; | tshmseg = shmsegs[i]; | ||||
if (tshmseg.cred->cr_prison != pr) | if (tshmseg.cred->cr_prison != pr) | ||||
tshmseg.u.shm_perm.key = IPC_PRIVATE; | tshmseg.u.shm_perm.key = IPC_PRIVATE; | ||||
} | } | ||||
error = SYSCTL_OUT(req, &tshmseg, sizeof(tshmseg)); | #ifdef COMPAT_FREEBSD32 | ||||
if (SV_CURPROC_FLAG(SV_ILP32)) { | |||||
bzero(&tshmseg32, sizeof(tshmseg32)); | |||||
freebsd32_ipcperm_out(&tshmseg.u.shm_perm, | |||||
&tshmseg32.u.shm_perm); | |||||
CP(tshmseg, tshmseg32, u.shm_segsz); | |||||
CP(tshmseg, tshmseg32, u.shm_lpid); | |||||
CP(tshmseg, tshmseg32, u.shm_cpid); | |||||
CP(tshmseg, tshmseg32, u.shm_nattch); | |||||
CP(tshmseg, tshmseg32, u.shm_atime); | |||||
CP(tshmseg, tshmseg32, u.shm_dtime); | |||||
CP(tshmseg, tshmseg32, u.shm_ctime); | |||||
/* Don't copy object, label, or cred */ | |||||
outaddr = &tshmseg32; | |||||
outsize = sizeof(tshmseg32); | |||||
} else | |||||
#endif | |||||
{ | |||||
tshmseg.object = NULL; | |||||
tshmseg.label = NULL; | |||||
tshmseg.cred = NULL; | |||||
outaddr = &tshmseg; | |||||
outsize = sizeof(tshmseg); | |||||
} | |||||
error = SYSCTL_OUT(req, outaddr, outsize); | |||||
if (error != 0) | if (error != 0) | ||||
break; | break; | ||||
} | } | ||||
SYSVSHM_UNLOCK(); | SYSVSHM_UNLOCK(); | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 607 Lines • Show Last 20 Lines |