DragonFlyBSD Kernel Audit
DF-3087 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/nfs/nfs_syscalls.c
+++ b/sys/vfs/nfs/nfs_syscalls.c
@@ -546,6 +546,7 @@ nfssvc_nfsd(struct nfsd_srvargs *nsd, caddr_t argp, struct thread *td)
 		} else {
 			error = 0;
 			slp = nfsd->nfsd_slp;
+			nd = nfsd->nfsd_nd;	/* resume request in progress */
 
 			lwkt_reltoken(&nfs_token);
 			lwkt_gettoken(&slp->ns_token);
@@ -572,8 +573,9 @@ nfssvc_nfsd(struct nfsd_srvargs *nsd, caddr_t argp, struct thread *td)
 		 * nfs_token not held here.  slp token is held.
 		 */
 		if (error || (slp->ns_flag & SLP_VALID) == 0) {
 			if (nd) {
 				kfree((caddr_t)nd, M_NFSRVDESC);
+				nfsd->nfsd_nd = NULL;
 				nd = NULL;
 			}
 			nfsd->nfsd_flag &= ~NFSD_REQINPROG;
@@ -756,8 +758,9 @@ nfssvc_nfsd(struct nfsd_srvargs *nsd, caddr_t argp, struct thread *td)
 			break;
 		    }
 		    if (nd) {
 			kfree((caddr_t)nd, M_NFSRVDESC);
+			nfsd->nfsd_nd = NULL;
 			nd = NULL;
 		    }