summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorericj <ericj@openbsd.org>2002-01-09 19:05:17 +0000
committerericj <ericj@openbsd.org>2002-01-09 19:05:17 +0000
commitc5b53070e5f0f8efbae975a7ccf316bc9c13c1ce (patch)
tree5bfd96c048980adffb1429f5eb2d791222ebb590
parentbetter iobase for rtii, from Maxim Tsyplakov <tm@oganer.net> (diff)
downloadwireguard-openbsd-c5b53070e5f0f8efbae975a7ccf316bc9c13c1ce.tar.xz
wireguard-openbsd-c5b53070e5f0f8efbae975a7ccf316bc9c13c1ce.zip
make sure we use lkmfree() in error cases as well.
millert@ ok
-rw-r--r--sys/kern/kern_lkm.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/kern/kern_lkm.c b/sys/kern/kern_lkm.c
index c3f7d579ebe..d0eaaf678fa 100644
--- a/sys/kern/kern_lkm.c
+++ b/sys/kern/kern_lkm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_lkm.c,v 1.35 2002/01/07 19:23:32 ericj Exp $ */
+/* $OpenBSD: kern_lkm.c,v 1.36 2002/01/09 19:05:17 ericj Exp $ */
/* $NetBSD: kern_lkm.c,v 1.31 1996/03/31 21:40:27 christos Exp $ */
/*
@@ -110,7 +110,7 @@ lkmopen(dev_t dev, int flag, int devtype, struct proc *p)
int error;
if (minor(dev) != 0)
- return (ENXIO); /* bad minor # */
+ return (ENXIO);
/*
* Use of the loadable kernel module device must be exclusive; we
@@ -250,17 +250,21 @@ int
lkmclose(dev_t dev, int flag, int mode, struct proc *p)
{
+ if (minor(dev) != 0)
+ return (ENXIO);
+
if (!(lkm_v & LKM_ALLOC))
return (EBADF);
/* do this before waking the herd... */
- if (curp != NULL) {
+ if (curp != NULL && !curp->refcnt) {
/*
* If we close before setting used, we have aborted
* by way of error or by way of close-on-exit from
* a premature exit of "modload".
*/
- lkmunreserve(); /* coerce state to LKM_IDLE */
+ lkmunreserve();
+ lkmfree(curp);
}
lkm_v &= ~LKM_ALLOC;
wakeup((caddr_t)&lkm_v); /* thundering herd "problem" here */
@@ -392,6 +396,8 @@ lkmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
case LMUNRESRV:
lkmunreserve();
+ if (curp)
+ lkmfree(curp);
break;
case LMREADY: