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) {
|
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 = vm_page_get_size_bytes(it->it_pg);
|
||||||
|
it->it_max -= (it->it_offset & VM_PAGE_MASK);
|
||||||
} else {
|
} else {
|
||||||
struct btree_node *n = btree_first(&it->it_obj->vo_pages);
|
struct btree_node *n = btree_first(&it->it_obj->vo_pages);
|
||||||
struct vm_page *pg
|
struct vm_page *pg
|
||||||
@@ -112,8 +116,9 @@ static kern_status_t object_iterator_seek(
|
|||||||
}
|
}
|
||||||
|
|
||||||
it->it_buf = NULL;
|
it->it_buf = NULL;
|
||||||
it->it_max = pg ? pg->p_vmo_offset
|
it->it_max
|
||||||
: it->it_obj->vo_size - it->it_offset;
|
= pg ? pg->p_vmo_offset - (it->it_offset & VM_PAGE_MASK)
|
||||||
|
: it->it_obj->vo_size - it->it_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return KERN_OK;
|
return KERN_OK;
|
||||||
|
|||||||
Reference in New Issue
Block a user