summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authortjr <tjr@FreeBSD.org>2004-06-05 02:18:28 +0000
committertjr <tjr@FreeBSD.org>2004-06-05 02:18:28 +0000
commit02a7d287a2f48d1a130773559be6fe4b5a9250c0 (patch)
treed9640fefa0e77a55f0655441d7ced9ece3f32a82 /sys/kern/vfs_vnops.c
parent445b7fecaa7b9b3cef0f344d22aa7304b6c70f91 (diff)
downloadFreeBSD-src-02a7d287a2f48d1a130773559be6fe4b5a9250c0.zip
FreeBSD-src-02a7d287a2f48d1a130773559be6fe4b5a9250c0.tar.gz
Change the types of vn_rdwr_inchunks()'s len and aresid arguments to
size_t and size_t *, respectively. Update callers for the new interface. This is a better fix for overflows that occurred when dumping segments larger than 2GB to core files.
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r--sys/kern/vfs_vnops.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 4091130..d2438bb 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -461,16 +461,17 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred,
enum uio_rw rw;
struct vnode *vp;
caddr_t base;
- int len;
+ size_t len;
off_t offset;
enum uio_seg segflg;
int ioflg;
struct ucred *active_cred;
struct ucred *file_cred;
- int *aresid;
+ size_t *aresid;
struct thread *td;
{
int error = 0;
+ int iaresid;
do {
int chunk;
@@ -487,8 +488,9 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred,
chunk = len;
if (rw != UIO_READ && vp->v_type == VREG)
bwillwrite();
+ iaresid = 0;
error = vn_rdwr(rw, vp, base, chunk, offset, segflg,
- ioflg, active_cred, file_cred, aresid, td);
+ ioflg, active_cred, file_cred, &iaresid, td);
len -= chunk; /* aresid calc already includes length */
if (error)
break;
@@ -497,7 +499,7 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred,
uio_yield();
} while (len);
if (aresid)
- *aresid += len;
+ *aresid = len + iaresid;
return (error);
}
OpenPOWER on IntegriCloud