diff options
author | John Baldwin <jhb@FreeBSD.org> | 2001-01-24 00:26:19 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2001-01-24 00:26:19 +0000 |
commit | cfb4c0b4f963f7ea3003da6ae68cf44e1666450f (patch) | |
tree | 081872cec20f153283280f63aaadd2a5c34185a1 | |
parent | 1e3e44f22f65b027fa08f67e2c0ddeab70cd90f9 (diff) | |
download | src-cfb4c0b4f963f7ea3003da6ae68cf44e1666450f.tar.gz src-cfb4c0b4f963f7ea3003da6ae68cf44e1666450f.zip |
Proc locking to protect p_ucred while we obtain additional references.
Notes
Notes:
svn path=/head/; revision=71496
-rw-r--r-- | sys/fs/cd9660/cd9660_vfsops.c | 17 | ||||
-rw-r--r-- | sys/isofs/cd9660/cd9660_vfsops.c | 17 |
2 files changed, 30 insertions, 4 deletions
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c index aaefb78a3628..cd58e6d09cc3 100644 --- a/sys/fs/cd9660/cd9660_vfsops.c +++ b/sys/fs/cd9660/cd9660_vfsops.c @@ -183,6 +183,7 @@ cd9660_mount(mp, path, data, ndp, p) { struct vnode *devvp; struct iso_args args; + struct ucred *uc; size_t size; int error; mode_t accessmode; @@ -227,7 +228,12 @@ cd9660_mount(mp, path, data, ndp, p) */ accessmode = VREAD; vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); - error = VOP_ACCESS(devvp, accessmode, p->p_ucred, p); + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = VOP_ACCESS(devvp, accessmode, uc, p); + crfree(uc); if (error) error = suser(p); if (error) { @@ -271,6 +277,7 @@ iso_mountfs(devvp, mp, p, argp) register struct iso_mnt *isomp = (struct iso_mnt *)0; struct buf *bp = NULL; struct buf *pribp = NULL, *supbp = NULL; + struct ucred *uc; dev_t dev = devvp->v_rdev; int error = EINVAL; int needclose = 0; @@ -298,7 +305,13 @@ iso_mountfs(devvp, mp, p, argp) return error; if (vcount(devvp) > 1 && devvp != rootvp) return EBUSY; - if ((error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0))) + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0); + crfree(uc); + if (error) return (error); vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index aaefb78a3628..cd58e6d09cc3 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -183,6 +183,7 @@ cd9660_mount(mp, path, data, ndp, p) { struct vnode *devvp; struct iso_args args; + struct ucred *uc; size_t size; int error; mode_t accessmode; @@ -227,7 +228,12 @@ cd9660_mount(mp, path, data, ndp, p) */ accessmode = VREAD; vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); - error = VOP_ACCESS(devvp, accessmode, p->p_ucred, p); + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = VOP_ACCESS(devvp, accessmode, uc, p); + crfree(uc); if (error) error = suser(p); if (error) { @@ -271,6 +277,7 @@ iso_mountfs(devvp, mp, p, argp) register struct iso_mnt *isomp = (struct iso_mnt *)0; struct buf *bp = NULL; struct buf *pribp = NULL, *supbp = NULL; + struct ucred *uc; dev_t dev = devvp->v_rdev; int error = EINVAL; int needclose = 0; @@ -298,7 +305,13 @@ iso_mountfs(devvp, mp, p, argp) return error; if (vcount(devvp) > 1 && devvp != rootvp) return EBUSY; - if ((error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0))) + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0); + crfree(uc); + if (error) return (error); vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); |