diff options
author | dfr <dfr@FreeBSD.org> | 1998-08-24 08:39:39 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1998-08-24 08:39:39 +0000 |
commit | 5fdaeb281d55485bff844095417fc1fbe1e45922 (patch) | |
tree | 896c704e890ada16cbc9fb366182b5bb739b46ec /sys/kern/sys_generic.c | |
parent | 1fb12a8979b46c244de5277f71b805b2fa8a39ad (diff) | |
download | FreeBSD-src-5fdaeb281d55485bff844095417fc1fbe1e45922.zip FreeBSD-src-5fdaeb281d55485bff844095417fc1fbe1e45922.tar.gz |
Change various syscalls to use size_t arguments instead of u_int.
Add some overflow checks to read/write (from bde).
Change all modifications to vm_page::flags, vm_page::busy, vm_object::flags
and vm_object::paging_in_progress to use operations which are not
interruptable.
Reviewed by: Bruce Evans <bde@zeta.org.au>
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r-- | sys/kern/sys_generic.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index f8adb85..3229829 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)sys_generic.c 8.5 (Berkeley) 1/21/94 - * $Id: sys_generic.c,v 1.38 1998/05/17 11:52:51 phk Exp $ + * $Id: sys_generic.c,v 1.39 1998/06/10 10:29:31 dfr Exp $ */ #include "opt_ktrace.h" @@ -61,6 +61,8 @@ #include <sys/ktrace.h> #endif +#include <machine/limits.h> + static MALLOC_DEFINE(M_IOCTLOPS, "ioctlops", "ioctl data buffer"); static MALLOC_DEFINE(M_SELECT, "select", "select() buffer"); MALLOC_DEFINE(M_IOV, "iov", "large iov's"); @@ -102,11 +104,9 @@ read(p, uap) auio.uio_iov = &aiov; auio.uio_iovcnt = 1; auio.uio_offset = -1; - - auio.uio_resid = uap->nbyte; - if (auio.uio_resid < 0) + if (uap->nbyte > INT_MAX) return (EINVAL); - + auio.uio_resid = uap->nbyte; auio.uio_rw = UIO_READ; auio.uio_segflg = UIO_USERSPACE; auio.uio_procp = p; @@ -183,11 +183,11 @@ readv(p, uap) goto done; auio.uio_resid = 0; for (i = 0; i < uap->iovcnt; i++) { - auio.uio_resid += iov->iov_len; - if (auio.uio_resid < 0) { + if (iov->iov_len > INT_MAX - auio.uio_resid) { error = EINVAL; goto done; } + auio.uio_resid += iov->iov_len; iov++; } #ifdef KTRACE @@ -253,6 +253,8 @@ write(p, uap) auio.uio_iov = &aiov; auio.uio_iovcnt = 1; auio.uio_offset = -1; + if (uap->nbyte > INT_MAX) + return (EINVAL); auio.uio_resid = uap->nbyte; auio.uio_rw = UIO_WRITE; auio.uio_segflg = UIO_USERSPACE; @@ -334,11 +336,11 @@ writev(p, uap) goto done; auio.uio_resid = 0; for (i = 0; i < uap->iovcnt; i++) { - auio.uio_resid += iov->iov_len; - if (auio.uio_resid < 0) { + if (iov->iov_len > INT_MAX - auio.uio_resid) { error = EINVAL; goto done; } + auio.uio_resid += iov->iov_len; iov++; } #ifdef KTRACE @@ -380,7 +382,7 @@ done: #ifndef _SYS_SYSPROTO_H_ struct ioctl_args { int fd; - int com; + u_long com; caddr_t data; }; #endif |