diff options
author | bde <bde@FreeBSD.org> | 1998-06-14 12:34:42 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1998-06-14 12:34:42 +0000 |
commit | 6ee3b2604446adfaaa390288cb2f3c64669c973e (patch) | |
tree | 92de95d0b0a98280a6d5df8ac8d2c5abfac5c85c /sys | |
parent | 7321b44b39b5b8d73378f7c295c2508f5d73a09a (diff) | |
download | FreeBSD-src-6ee3b2604446adfaaa390288cb2f3c64669c973e.zip FreeBSD-src-6ee3b2604446adfaaa390288cb2f3c64669c973e.tar.gz |
Avoid a 64-bit division in kernfs_readdir(). Fixed related overflows
and arg checking.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/miscfs/kernfs/kernfs_vnops.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/miscfs/kernfs/kernfs_vnops.c b/sys/miscfs/kernfs/kernfs_vnops.c index 1011c49..a6bbfec 100644 --- a/sys/miscfs/kernfs/kernfs_vnops.c +++ b/sys/miscfs/kernfs/kernfs_vnops.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95 - * $Id: kernfs_vnops.c,v 1.31 1998/06/10 06:34:56 peter Exp $ + * $Id: kernfs_vnops.c,v 1.32 1998/06/10 21:21:30 dfr Exp $ */ /* @@ -524,7 +524,7 @@ kernfs_readdir(ap) int a_ncookies; } */ *ap; { - int error, i; + int error, i, off; struct uio *uio = ap->a_uio; struct kern_target *kt; struct dirent d; @@ -539,7 +539,12 @@ kernfs_readdir(ap) if (ap->a_ncookies != NULL) panic("kernfs_readdir: not hungry"); - i = uio->uio_offset / UIO_MX; + off = (int)uio->uio_offset; + if (off != uio->uio_offset || off < 0 || (u_int)off % UIO_MX != 0 || + uio->uio_resid < UIO_MX) + return (EINVAL); + + i = (u_int)off / UIO_MX; error = 0; for (kt = &kern_targets[i]; uio->uio_resid >= UIO_MX && i < nkern_targets; kt++, i++) { |