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:
parent
1568d57c8b
commit
66aa1d7eeb
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user