summaryrefslogtreecommitdiffstats
path: root/sys/nfsclient
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2005-10-26 07:18:37 +0000
committerglebius <glebius@FreeBSD.org>2005-10-26 07:18:37 +0000
commitd9ad5313fd8fecf625cb947524ce3d56da1e7600 (patch)
tree3f4a9f5966afeecc321a52a8cf7599fb04dd68ff /sys/nfsclient
parent092974700594d831ce82e7ffa941f312151f3ef9 (diff)
downloadFreeBSD-src-d9ad5313fd8fecf625cb947524ce3d56da1e7600.zip
FreeBSD-src-d9ad5313fd8fecf625cb947524ce3d56da1e7600.tar.gz
- Fix leak of struct nlminfo on process exit.
- Fix malloc type collision, that made the above problem difficult to understand. Reported by: Vladimir Sharun <sharun ukr.net>
Diffstat (limited to 'sys/nfsclient')
-rw-r--r--sys/nfsclient/nfs_lock.c16
-rw-r--r--sys/nfsclient/nlminfo.h2
2 files changed, 15 insertions, 3 deletions
diff --git a/sys/nfsclient/nfs_lock.c b/sys/nfsclient/nfs_lock.c
index e23fd7a..ec021e9 100644
--- a/sys/nfsclient/nfs_lock.c
+++ b/sys/nfsclient/nfs_lock.c
@@ -62,9 +62,13 @@ __FBSDID("$FreeBSD$");
#include <nfsclient/nfs_lock.h>
#include <nfsclient/nlminfo.h>
+extern void (*nlminfo_release_p)(struct proc *p);
+
MALLOC_DEFINE(M_NFSLOCK, "NFS lock", "NFS lock request");
+MALLOC_DEFINE(M_NLMINFO, "nlminfo", "NFS lock process structure");
static int nfslockdans(struct thread *td, struct lockd_ans *ansp);
+static void nlminfo_release(struct proc *p);
/*
* --------------------------------------------------------------------
* A miniature device driver which the userland uses to talk to us.
@@ -194,6 +198,7 @@ nfslock_modevent(module_t mod __unused, int type, void *data __unused)
printf("nfslock: pseudo-device\n");
mtx_init(&nfslock_mtx, "nfslock", NULL, MTX_DEF);
TAILQ_INIT(&nfslock_list);
+ nlminfo_release_p = nlminfo_release;
nfslock_dev = make_dev(&nfslock_cdevsw, 0,
UID_ROOT, GID_KMEM, 0600, _PATH_NFSLCKDEV);
return (0);
@@ -259,7 +264,7 @@ nfs_dolock(struct vop_advlock_args *ap)
*/
if (p->p_nlminfo == NULL) {
MALLOC(p->p_nlminfo, struct nlminfo *,
- sizeof(struct nlminfo), M_LOCKF, M_WAITOK | M_ZERO);
+ sizeof(struct nlminfo), M_NLMINFO, M_WAITOK | M_ZERO);
p->p_nlminfo->pid_start = p->p_stats->p_start;
timevaladd(&p->p_nlminfo->pid_start, &boottime);
}
@@ -381,3 +386,12 @@ nfslockdans(struct thread *td, struct lockd_ans *ansp)
return (0);
}
+/*
+ * Free nlminfo attached to process.
+ */
+void
+nlminfo_release(struct proc *p)
+{
+ free(p->p_nlminfo, M_NLMINFO);
+ p->p_nlminfo = NULL;
+}
diff --git a/sys/nfsclient/nlminfo.h b/sys/nfsclient/nlminfo.h
index 3dc55b4..7d3e0ff 100644
--- a/sys/nfsclient/nlminfo.h
+++ b/sys/nfsclient/nlminfo.h
@@ -40,5 +40,3 @@ struct nlminfo {
int getlk_pid;
struct timeval pid_start; /* process starting time */
};
-
-extern void nlminfo_release(struct proc *p);
OpenPOWER on IntegriCloud