mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-18 10:35:55 +00:00
Fix the memory leak that occurs when the nfscommon.ko module is unloaded.
This leak was introduced by r291527. Since the nfscommon.ko module is rarely unloaded, this leak would not have been much of an issue. MFC after: 2 weeks
This commit is contained in:
parent
e3c6864e80
commit
65171ebbc8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=291638
@ -623,6 +623,8 @@ nfscommon_modevent(module_t mod, int type, void *data)
|
||||
|
||||
nfsd_call_nfscommon = NULL;
|
||||
callout_drain(&newnfsd_callout);
|
||||
/* Clean out the name<-->id cache. */
|
||||
nfsrv_cleanusergroup();
|
||||
/* and get rid of the mutexes */
|
||||
mtx_destroy(&nfs_nameid_mutex);
|
||||
mtx_destroy(&newnfsd_mtx);
|
||||
|
@ -3545,6 +3545,55 @@ nfsrv_removeuser(struct nfsusrgrp *usrp, int isuser)
|
||||
free(usrp, M_NFSUSERGROUP);
|
||||
}
|
||||
|
||||
/*
|
||||
* Free up all the allocations related to the name<-->id cache.
|
||||
* This function should only be called when the nfsuserd daemon isn't
|
||||
* running, since it doesn't do any locking.
|
||||
* This function is meant to be used when the nfscommon module is unloaded.
|
||||
*/
|
||||
APPLESTATIC void
|
||||
nfsrv_cleanusergroup(void)
|
||||
{
|
||||
struct nfsrv_lughash *hp, *hp2;
|
||||
struct nfsusrgrp *nusrp, *usrp;
|
||||
int i;
|
||||
|
||||
if (nfsuserhash == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nfsrv_lughashsize; i++) {
|
||||
hp = &nfsuserhash[i];
|
||||
TAILQ_FOREACH_SAFE(usrp, &hp->lughead, lug_numhash, nusrp) {
|
||||
TAILQ_REMOVE(&hp->lughead, usrp, lug_numhash);
|
||||
hp2 = NFSUSERNAMEHASH(usrp->lug_name,
|
||||
usrp->lug_namelen);
|
||||
TAILQ_REMOVE(&hp2->lughead, usrp, lug_namehash);
|
||||
if (usrp->lug_cred != NULL)
|
||||
crfree(usrp->lug_cred);
|
||||
free(usrp, M_NFSUSERGROUP);
|
||||
}
|
||||
hp = &nfsgrouphash[i];
|
||||
TAILQ_FOREACH_SAFE(usrp, &hp->lughead, lug_numhash, nusrp) {
|
||||
TAILQ_REMOVE(&hp->lughead, usrp, lug_numhash);
|
||||
hp2 = NFSGROUPNAMEHASH(usrp->lug_name,
|
||||
usrp->lug_namelen);
|
||||
TAILQ_REMOVE(&hp2->lughead, usrp, lug_namehash);
|
||||
if (usrp->lug_cred != NULL)
|
||||
crfree(usrp->lug_cred);
|
||||
free(usrp, M_NFSUSERGROUP);
|
||||
}
|
||||
mtx_destroy(&nfsuserhash[i].mtx);
|
||||
mtx_destroy(&nfsusernamehash[i].mtx);
|
||||
mtx_destroy(&nfsgroupnamehash[i].mtx);
|
||||
mtx_destroy(&nfsgrouphash[i].mtx);
|
||||
}
|
||||
free(nfsuserhash, M_NFSUSERGROUP);
|
||||
free(nfsusernamehash, M_NFSUSERGROUP);
|
||||
free(nfsgrouphash, M_NFSUSERGROUP);
|
||||
free(nfsgroupnamehash, M_NFSUSERGROUP);
|
||||
free(nfsrv_dnsname, M_NFSSTRING);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function scans a byte string and checks for UTF-8 compliance.
|
||||
* It returns 0 if it conforms and NFSERR_INVAL if not.
|
||||
|
@ -283,6 +283,7 @@ void nfsv4_getref(struct nfsv4lock *, int *, void *, struct mount *);
|
||||
int nfsv4_getref_nonblock(struct nfsv4lock *);
|
||||
int nfsv4_testlock(struct nfsv4lock *);
|
||||
int nfsrv_mtostr(struct nfsrv_descript *, char *, int);
|
||||
void nfsrv_cleanusergroup(void);
|
||||
int nfsrv_checkutf8(u_int8_t *, int);
|
||||
int newnfs_sndlock(int *);
|
||||
void newnfs_sndunlock(int *);
|
||||
|
Loading…
Reference in New Issue
Block a user