diff options
author | phk <phk@FreeBSD.org> | 2004-09-24 06:16:48 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-09-24 06:16:48 +0000 |
commit | ee853f3efd535a8b40d35ea3cca44dbe51ed3256 (patch) | |
tree | b20eb33ecb2f012f42d854e39b3ad33bef379bc7 /sys/kern | |
parent | 5536d5757bcdba9f55338d879f2757ac320e7a43 (diff) | |
download | FreeBSD-src-ee853f3efd535a8b40d35ea3cca44dbe51ed3256.zip FreeBSD-src-ee853f3efd535a8b40d35ea3cca44dbe51ed3256.tar.gz |
Hold dev_lock and check for NULL devsw pointer when we service FIODTYPE ioctl.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_vnops.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 7cc09cc..c9d30e9 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -806,12 +806,20 @@ vn_ioctl(fp, com, data, active_cred, td) case VCHR: case VBLK: if (com == FIODTYPE) { - if (vp->v_rdev == NULL) - return (EOPNOTSUPP); + dev_lock(); if (vp->v_type != VCHR && vp->v_type != VBLK) - return (ENOTTY); - *(int *)data = devsw(vp->v_rdev)->d_flags & D_TYPEMASK; - return (0); + error = ENOTTY; + else if (vp->v_rdev == NULL) + error = ENXIO; + else if (vp->v_rdev->si_devsw == NULL) + error = ENXIO; + else { + error = 0; + *(int *)data = + vp->v_rdev->si_devsw->d_flags & D_TYPEMASK; + } + dev_unlock(); + return (error); } error = VOP_IOCTL(vp, com, data, fp->f_flag, active_cred, td); if (error == ENOIOCTL) { |