Slightly better sys_pread uptr handling

上级 1007e834
...@@ -62,16 +62,27 @@ ssize_t ...@@ -62,16 +62,27 @@ ssize_t
sys_pread(int fd, void *ubuf, size_t count, off_t offset) sys_pread(int fd, void *ubuf, size_t count, off_t offset)
{ {
sref<file> f; sref<file> f;
uptr i = (uptr)ubuf;
if (!getfile(fd, &f)) if (!getfile(fd, &f))
return -1; return -1;
for(uptr va = PGROUNDDOWN(i); va < i+count; va = va + PGSIZE) if (count < PGSIZE) {
if(pagefault(myproc()->vmap, va, 0) < 0) ssize_t r;
return -1; char* b;
b = kalloc("preadbuf");
return f->pread((char*)ubuf, count, offset); r = f->pread(b, count, offset);
if (r > 0)
putmem(ubuf, b, r);
kfree(b);
return r;
} else {
// XXX(sbw) pagefaulting doesn't guarantee ubuf is mapped
// while pread executes
uptr i = (uptr)ubuf;
for(uptr va = PGROUNDDOWN(i); va < i+count; va = va + PGSIZE)
if(pagefault(myproc()->vmap, va, 0) < 0)
return -1;
return f->pread((char*)ubuf, count, offset);
}
} }
//SYSCALL //SYSCALL
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论