Hello,
Diego Nieto Cid, le sam. 28 juin 2025 23:31:45 +0100, a ecrit:
> I was updating this patch and I've gut a doubt with what to do with the
> result of vm_map_find_entry_anywhere in case of a failure to enforce the
> limit.
>
> I end up with code like below:
>
> if (anywhere) {
> entry = vm_map_find_entry_anywhere(map, size, mask, FALSE,
> &start);
>
> if (entry == NULL) {
> RETURN(KERN_NO_SPACE);
> }
>
> end = start + size;
> *address = start;
> next_entry = entry->vme_next;
> } else {
> ...
> vm_map_lock(map);
> ...
> }
>
> followed by the call to vm_map_enforce_limit:
>
> /*
> * If the allocation has protection equal to VM_PROT_NONE,
> * don't check for limits as the map's size_none field is
> * not yet incremented.
> */
> if (max_protection != VM_PROT_NONE) {
> if ((result = vm_map_enforce_limit(map, size, "vm_map_enter"))
> != KERN_SUCCESS)
> RETURN(result);
> }
>
> it requires the map locked which is the case as if anywhere is TRUE
> vm_map_find_entry_anywhere call will lock the map and otherwise the
> map is locked in the else case of the if in the first snippet.
>
> My doubt is what to do the non NULL entry in case result, returned
> by the enforcer function, is not KERN_SUCCESS. Wouldn't I be leaking
> a vm_map_entry_t?
No, vm_map_find_entry_anywhere only returns an existing entry, which
vm_map_find_entry tries to extend, and if that is not possible,
vm_map_find_entry will allocate a new entry itself.
Samuel