vm: object: fix iterator using wrong buffer offset when seek exceeds current buffer size
This commit is contained in:
@@ -96,8 +96,12 @@ static kern_status_t object_iterator_seek(
|
||||
}
|
||||
|
||||
if (it->it_pg) {
|
||||
it->it_buf = vm_page_get_vaddr(it->it_pg);
|
||||
virt_addr_t vaddr = (virt_addr_t)vm_page_get_vaddr(it->it_pg);
|
||||
vaddr += (it->it_offset & VM_PAGE_MASK);
|
||||
|
||||
it->it_buf = (void *)vaddr;
|
||||
it->it_max = vm_page_get_size_bytes(it->it_pg);
|
||||
it->it_max -= (it->it_offset & VM_PAGE_MASK);
|
||||
} else {
|
||||
struct btree_node *n = btree_first(&it->it_obj->vo_pages);
|
||||
struct vm_page *pg
|
||||
@@ -112,8 +116,9 @@ static kern_status_t object_iterator_seek(
|
||||
}
|
||||
|
||||
it->it_buf = NULL;
|
||||
it->it_max = pg ? pg->p_vmo_offset
|
||||
: it->it_obj->vo_size - it->it_offset;
|
||||
it->it_max
|
||||
= pg ? pg->p_vmo_offset - (it->it_offset & VM_PAGE_MASK)
|
||||
: it->it_obj->vo_size - it->it_offset;
|
||||
}
|
||||
|
||||
return KERN_OK;
|
||||
|
||||
Reference in New Issue
Block a user