vm: object: fix iterator using wrong buffer offset when seek exceeds current buffer size

This commit is contained in:
2026-02-21 11:07:12 +00:00
parent 0bae39e550
commit ed25ee6761

View File

@@ -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;