summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2001-11-14 18:20:45 +0000
committerrwatson <rwatson@FreeBSD.org>2001-11-14 18:20:45 +0000
commit08704afd447096c2834699aec78e39c3a53a471a (patch)
tree725afa461cc74ca5f5cf3810e227f0b15ecc063c
parent39806e442b3b2819a72be69a474c4d3194144c14 (diff)
downloadFreeBSD-src-08704afd447096c2834699aec78e39c3a53a471a.zip
FreeBSD-src-08704afd447096c2834699aec78e39c3a53a471a.tar.gz
o Modify nfslockdans() to accept a thread reference instead of a proc
reference: with td->td_ucred, it will be desirable to authorize based on td->td_ucred, rather than p->p_ucred. o Since the same variable 'p' was later used with pfind() on the target process for the wakeup, introduce a new local variable 'targetp' to use instead. Obtained from: TrustedBSD Project Sponsored by: DARPA, NAI Labs
-rw-r--r--sys/nfsclient/nfs_lock.c26
-rw-r--r--sys/nfsclient/nfs_lock.h2
-rw-r--r--sys/nfsclient/nfs_nfsiod.c2
3 files changed, 16 insertions, 14 deletions
diff --git a/sys/nfsclient/nfs_lock.c b/sys/nfsclient/nfs_lock.c
index dee4b68..a239c1c 100644
--- a/sys/nfsclient/nfs_lock.c
+++ b/sys/nfsclient/nfs_lock.c
@@ -230,8 +230,9 @@ nfs_dolock(struct vop_advlock_args *ap)
* NFS advisory byte-level locks answer from the lock daemon.
*/
int
-nfslockdans(struct proc *p, struct lockd_ans *ansp)
+nfslockdans(struct thread *td, struct lockd_ans *ansp)
{
+ struct proc *targetp;
int error;
/* Let root, or someone who once was root (lockd generally
@@ -240,7 +241,8 @@ nfslockdans(struct proc *p, struct lockd_ans *ansp)
*
* XXX This authorization check is probably not right.
*/
- if ((error = suser(p)) != 0 && p->p_ucred->cr_svuid != 0)
+ if ((error = suser(td->td_proc)) != 0 &&
+ td->td_proc->p_ucred->cr_svuid != 0)
return (error);
/* the version should match, or we're out of sync */
@@ -248,7 +250,7 @@ nfslockdans(struct proc *p, struct lockd_ans *ansp)
return (EINVAL);
/* Find the process, set its return errno and wake it up. */
- if ((p = pfind(ansp->la_msg_ident.pid)) == NULL)
+ if ((targetp = pfind(ansp->la_msg_ident.pid)) == NULL)
return (ESRCH);
/* verify the pid hasn't been reused (if we can), and it isn't waiting
@@ -256,21 +258,21 @@ nfslockdans(struct proc *p, struct lockd_ans *ansp)
* the match fails, because we've already used ESRCH above, and this
* is sort of like writing on a pipe after the reader has closed it.
*/
- if (p->p_nlminfo == NULL ||
+ if (targetp->p_nlminfo == NULL ||
((ansp->la_msg_ident.msg_seq != -1) &&
- (timevalcmp(&p->p_nlminfo->pid_start,
+ (timevalcmp(&targetp->p_nlminfo->pid_start,
&ansp->la_msg_ident.pid_start, !=) ||
- p->p_nlminfo->msg_seq != ansp->la_msg_ident.msg_seq))) {
- PROC_UNLOCK(p);
+ targetp->p_nlminfo->msg_seq != ansp->la_msg_ident.msg_seq))) {
+ PROC_UNLOCK(targetp);
return (EPIPE);
}
- p->p_nlminfo->retcode = ansp->la_errno;
- p->p_nlminfo->set_getlk_pid = ansp->la_set_getlk_pid;
- p->p_nlminfo->getlk_pid = ansp->la_getlk_pid;
+ targetp->p_nlminfo->retcode = ansp->la_errno;
+ targetp->p_nlminfo->set_getlk_pid = ansp->la_set_getlk_pid;
+ targetp->p_nlminfo->getlk_pid = ansp->la_getlk_pid;
- (void)wakeup((void *)p->p_nlminfo);
+ (void)wakeup((void *)targetp->p_nlminfo);
- PROC_UNLOCK(p);
+ PROC_UNLOCK(targetp);
return (0);
}
diff --git a/sys/nfsclient/nfs_lock.h b/sys/nfsclient/nfs_lock.h
index 0d081c4..9de041d 100644
--- a/sys/nfsclient/nfs_lock.h
+++ b/sys/nfsclient/nfs_lock.h
@@ -88,5 +88,5 @@ struct lockd_ans {
#ifdef _KERNEL
int nfs_dolock(struct vop_advlock_args *ap);
-int nfslockdans(struct proc *p, struct lockd_ans *ansp);
+int nfslockdans(struct thread *td, struct lockd_ans *ansp);
#endif
diff --git a/sys/nfsclient/nfs_nfsiod.c b/sys/nfsclient/nfs_nfsiod.c
index 4e0ac10..6fe1a55 100644
--- a/sys/nfsclient/nfs_nfsiod.c
+++ b/sys/nfsclient/nfs_nfsiod.c
@@ -113,7 +113,7 @@ nfsclnt(struct thread *td, struct nfsclnt_args *uap)
if ((uap->flag & NFSCLNT_LOCKDANS) != 0) {
error = copyin(uap->argp, &la, sizeof(la));
- return (error != 0 ? error : nfslockdans(td->td_proc, &la));
+ return (error != 0 ? error : nfslockdans(td, &la));
}
return EINVAL;
}
OpenPOWER on IntegriCloud