summaryrefslogtreecommitdiffstats
path: root/sys/kern/spec_vnops.c
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2013-07-29 18:51:42 +0000
committerkettenis <kettenis@openbsd.org>2013-07-29 18:51:42 +0000
commit2ca8bce83060c3371dc8b5baeb085a9c4b70ef02 (patch)
treebd855877d81c3f0fecf21cc4ee70bcf33e3fd569 /sys/kern/spec_vnops.c
parentand we're hacking on 5.4-current now (diff)
downloadwireguard-openbsd-2ca8bce83060c3371dc8b5baeb085a9c4b70ef02.tar.xz
wireguard-openbsd-2ca8bce83060c3371dc8b5baeb085a9c4b70ef02.zip
Do a proper cleanup in the error path when opening a clonable device fails.
ok guenther@
Diffstat (limited to 'sys/kern/spec_vnops.c')
-rw-r--r--sys/kern/spec_vnops.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/kern/spec_vnops.c b/sys/kern/spec_vnops.c
index e6c3eb6f41d..49d301de241 100644
--- a/sys/kern/spec_vnops.c
+++ b/sys/kern/spec_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: spec_vnops.c,v 1.74 2013/07/09 15:37:43 beck Exp $ */
+/* $OpenBSD: spec_vnops.c,v 1.75 2013/07/29 18:51:42 kettenis Exp $ */
/* $NetBSD: spec_vnops.c,v 1.29 1996/04/22 01:42:38 christos Exp $ */
/*
@@ -701,8 +701,10 @@ spec_open_clone(struct vop_open_args *ap)
return (EBUSY); /* too many open instances */
error = cdevvp(makedev(major(vp->v_rdev), i), &cvp);
- if (error)
+ if (error) {
+ clrbit(vp->v_specbitmap, i);
return (error); /* out of vnodes */
+ }
VOP_UNLOCK(vp, 0, ap->a_p);
@@ -712,8 +714,9 @@ spec_open_clone(struct vop_open_args *ap)
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, ap->a_p);
if (error) {
- clrbit(vp->v_specbitmap, i);
- return (error); /* device open failed */
+ vput(cvp);
+ clrbit(vp->v_specbitmap, i);
+ return (error); /* device open failed */
}
cvp->v_flag |= VCLONE;