diff options
author | 2002-01-09 19:05:17 +0000 | |
---|---|---|
committer | 2002-01-09 19:05:17 +0000 | |
commit | c5b53070e5f0f8efbae975a7ccf316bc9c13c1ce (patch) | |
tree | 5bfd96c048980adffb1429f5eb2d791222ebb590 | |
parent | better iobase for rtii, from Maxim Tsyplakov <tm@oganer.net> (diff) | |
download | wireguard-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.c | 14 |
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: |