Do not dereference vp->v_rdev without holding any of dev_mtx or vnode

lock. Use code similar to devfs_fp_check(), but inlined to feet other
checks performed by ttyhook_register().

Reviewed by:	ed
This commit is contained in:
kib 2009-06-08 13:34:45 +00:00
parent 1568d57c8b
commit 66aa1d7eeb

View File

@ -1742,19 +1742,31 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd,
goto done1; goto done1;
} }
/* Make sure the vnode is bound to a character device. */ /*
error = EINVAL; * Make sure the vnode is bound to a character device.
if (fp->f_type != DTYPE_VNODE || fp->f_vnode->v_type != VCHR || * Unlocked check for the vnode type is ok there, because we
fp->f_vnode->v_rdev == NULL) * only shall prevent calling devvn_refthread on the file that
* never has been opened over a character device.
*/
if (fp->f_type != DTYPE_VNODE || fp->f_vnode->v_type != VCHR) {
error = EINVAL;
goto done1; goto done1;
dev = fp->f_vnode->v_rdev; }
/* Make sure it is a TTY. */ /* Make sure it is a TTY. */
cdp = dev_refthread(dev); cdp = devvn_refthread(fp->f_vnode, &dev);
if (cdp == NULL) if (cdp == NULL) {
error = ENXIO;
goto done1; goto done1;
if (cdp != &ttydev_cdevsw) }
if (dev != fp->f_data) {
error = ENXIO;
goto done2; goto done2;
}
if (cdp != &ttydev_cdevsw) {
error = ENOTTY;
goto done2;
}
tp = dev->si_drv1; tp = dev->si_drv1;
/* Try to attach the hook to the TTY. */ /* Try to attach the hook to the TTY. */