summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1998-12-03 12:35:47 +0000
committerdg <dg@FreeBSD.org>1998-12-03 12:35:47 +0000
commit7fd65a112e432373f5aeb35ee767f53565b094c9 (patch)
treed2a0b81ffb1165afa84ce9428d47e9e56ee20ff1 /sys/kern/uipc_syscalls.c
parent32e8b6ac952678d62b960f79fe930f9a0f0a273b (diff)
downloadFreeBSD-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.c12
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;
/*
OpenPOWER on IntegriCloud