summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2004-02-05 21:13:58 +0000
committermillert <millert@openbsd.org>2004-02-05 21:13:58 +0000
commit4f98d6505274a8a709cce8267dbcf54ce294aa56 (patch)
tree6c164adda3ca196f47ac97cedbdf9cc95ff67800
parentexpose two more functions (diff)
downloadwireguard-openbsd-4f98d6505274a8a709cce8267dbcf54ce294aa56.tar.xz
wireguard-openbsd-4f98d6505274a8a709cce8267dbcf54ce294aa56.zip
Correct a reference counting bug in shmat(2); adapted from FreeBSD.
OK deraadt@ tedu@ dhartmei@
-rw-r--r--sys/kern/sysv_shm.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 7912cf2f5fc..99be9fccf55 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysv_shm.c,v 1.40 2003/12/22 00:35:57 millert Exp $ */
+/* $OpenBSD: sysv_shm.c,v 1.41 2004/02/05 21:13:58 millert Exp $ */
/* $NetBSD: sysv_shm.c,v 1.50 1998/10/21 22:24:29 tron Exp $ */
/*
@@ -278,8 +278,10 @@ sys_shmat1(struct proc *p, void *v, register_t *retval, int findremoved)
error = uvm_map(&p->p_vmspace->vm_map, &attach_va, size,
shm_handle->shm_object, 0, 0, UVM_MAPFLAG(prot, prot,
UVM_INH_SHARE, UVM_ADV_RANDOM, 0));
- if (error)
+ if (error) {
+ uao_detach(shm_handle->shm_object);
return (error);
+ }
shmmap_s->va = attach_va;
shmmap_s->shmid = SCARG(uap, shmid);