diff options
author | dg <dg@FreeBSD.org> | 1998-12-03 12:35:47 +0000 |
---|---|---|
committer | dg <dg@FreeBSD.org> | 1998-12-03 12:35:47 +0000 |
commit | 7fd65a112e432373f5aeb35ee767f53565b094c9 (patch) | |
tree | d2a0b81ffb1165afa84ce9428d47e9e56ee20ff1 /sys/kern/uipc_syscalls.c | |
parent | 32e8b6ac952678d62b960f79fe930f9a0f0a273b (diff) | |
download | FreeBSD-src-7fd65a112e432373f5aeb35ee767f53565b094c9.zip FreeBSD-src-7fd65a112e432373f5aeb35ee767f53565b094c9.tar.gz |
Fixed broken code in sendfile(2) when using file offsets.
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r-- | sys/kern/uipc_syscalls.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 5abf279..f352d43 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94 - * $Id: uipc_syscalls.c,v 1.46 1998/11/18 09:00:47 dg Exp $ + * $Id: uipc_syscalls.c,v 1.47 1998/11/23 00:45:39 truckman Exp $ */ #include "opt_compat.h" @@ -1494,6 +1494,7 @@ sendfile(struct proc *p, struct sendfile_args *uap) */ for (off = uap->offset; ; off += xfsize, sbytes += xfsize) { vm_pindex_t pindex; + vm_offset_t pgoff; pindex = OFF_TO_IDX(off); retry_lookup: @@ -1504,8 +1505,9 @@ retry_lookup: xfsize = obj->un_pager.vnp.vnp_size - off; if (xfsize > PAGE_SIZE) xfsize = PAGE_SIZE; - if (off & PAGE_MASK) - xfsize -= (off & PAGE_MASK); + pgoff = (vm_offset_t)(off & PAGE_MASK); + if (PAGE_SIZE - pgoff < xfsize) + xfsize = PAGE_SIZE - pgoff; if (uap->nbytes && xfsize > (uap->nbytes - sbytes)) xfsize = uap->nbytes - sbytes; if (xfsize <= 0) @@ -1530,7 +1532,7 @@ retry_lookup: */ pg = vm_page_lookup(obj, pindex); if (pg == NULL || (!(pg->flags & PG_BUSY) && !pg->busy && - !vm_page_is_valid(pg, off & PAGE_MASK, xfsize))) { + !vm_page_is_valid(pg, pgoff, xfsize))) { struct uio auio; struct iovec aiov; int bsize; @@ -1614,7 +1616,7 @@ retry_lookup: m->m_ext.ext_ref = sf_buf_ref; m->m_ext.ext_buf = (void *)sf->kva; m->m_ext.ext_size = PAGE_SIZE; - m->m_data = (char *) sf->kva + (off & PAGE_MASK); + m->m_data = (char *) sf->kva + pgoff; m->m_flags |= M_EXT; m->m_pkthdr.len = m->m_len = xfsize; /* |