diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2003-01-06 20:11:29 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2003-01-06 20:11:29 +0000 |
commit | c4361a6645632f71926af0ac6b0fc3b9936c70c7 (patch) | |
tree | a59fb068d63c567d9eb4adfcf8f5897b03887484 | |
parent | f5fff6e36f62ae1b98bc76583e533e013310849f (diff) |
Add a "findremoved" arg to shm_find_segment_by_shmid() similar to
NetBSD and allow shmctl() to operate on shm segments that have been
marked for removal like other OSes do.
-rw-r--r-- | sys/kern/sysv_shm.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c index b6cde1e4fb8..8f19a889d76 100644 --- a/sys/kern/sysv_shm.c +++ b/sys/kern/sysv_shm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sysv_shm.c,v 1.31 2002/12/17 23:32:31 millert Exp $ */ +/* $OpenBSD: sysv_shm.c,v 1.32 2003/01/06 20:11:28 millert Exp $ */ /* $NetBSD: sysv_shm.c,v 1.50 1998/10/21 22:24:29 tron Exp $ */ /* @@ -81,7 +81,7 @@ struct shmid_ds **shmsegs; /* linear mapping of shmid -> shmseg */ struct pool shm_pool; unsigned short *shmseqs; /* array of shm sequence numbers */ -struct shmid_ds *shm_find_segment_by_shmid(int); +struct shmid_ds *shm_find_segment_by_shmid(int, int); /* * Provides the following externally accessible functions: @@ -137,18 +137,18 @@ shm_find_segment_by_key(key_t key) } struct shmid_ds * -shm_find_segment_by_shmid(int shmid) +shm_find_segment_by_shmid(int shmid, int findremoved) { int segnum; struct shmid_ds *shmseg; segnum = IPCID_TO_IX(shmid); if (segnum < 0 || segnum >= shminfo.shmmni || - (shmseg = shmsegs[segnum]) == NULL) - return (NULL); - if ((shmseg->shm_perm.mode & SHMSEG_REMOVED) || + (shmseg = shmsegs[segnum]) == NULL || shmseg->shm_perm.seq != IPCID_TO_SEQ(shmid)) return (NULL); + if (!findremoved && (shmseg->shm_perm.mode & SHMSEG_REMOVED)) + return (NULL); return (shmseg); } @@ -243,7 +243,7 @@ sys_shmat(struct proc *p, void *v, register_t *retval) shmmap_s->shmid = -1; p->p_vmspace->vm_shm = (caddr_t)shmmap_h; } - shmseg = shm_find_segment_by_shmid(SCARG(uap, shmid)); + shmseg = shm_find_segment_by_shmid(SCARG(uap, shmid), 0); if (shmseg == NULL) return (EINVAL); error = ipcperm(cred, &shmseg->shm_perm, @@ -306,7 +306,7 @@ sys_shmctl(struct proc *p, void *v, register_t *retval) struct shmid_ds inbuf; struct shmid_ds *shmseg; - shmseg = shm_find_segment_by_shmid(SCARG(uap, shmid)); + shmseg = shm_find_segment_by_shmid(SCARG(uap, shmid), 1); if (shmseg == NULL) return (EINVAL); switch (SCARG(uap, cmd)) { |