From b90260e7035c8f2d90612cf58c33ab8d1844306b Mon Sep 17 00:00:00 2001 From: kib Date: Wed, 21 Jun 2006 12:59:05 +0000 Subject: Make the mincore(2) return ENOMEM when requested range is not fully mapped. Requested by: Bruno Haible Reviewed by: alc Approved by: pjd (mentor) MFC after: 1 month --- sys/vm/vm_mmap.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'sys/vm') diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 5965d4a..244877e 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -757,7 +757,7 @@ mincore(td, uap) end = addr + (vm_size_t)round_page(uap->len); map = &td->td_proc->p_vmspace->vm_map; if (end > vm_map_max(map) || end < addr) - return (EINVAL); + return (ENOMEM); /* * Address of byte vector @@ -770,8 +770,10 @@ mincore(td, uap) RestartScan: timestamp = map->timestamp; - if (!vm_map_lookup_entry(map, addr, &entry)) - entry = entry->next; + if (!vm_map_lookup_entry(map, addr, &entry)) { + vm_map_unlock_read(map); + return (ENOMEM); + } /* * Do this on a map entry basis so that if the pages are not @@ -784,6 +786,16 @@ RestartScan: current = current->next) { /* + * check for contiguity + */ + if (current->end < end && + (entry->next == &map->header || + current->next->start > current->end)) { + vm_map_unlock_read(map); + return (ENOMEM); + } + + /* * ignore submaps (for now) or null objects */ if ((current->eflags & MAP_ENTRY_IS_SUB_MAP) || -- cgit v1.1