On 9/21/21 9:56 PM, Warner Losh wrote:
+        /* Reject the mapping if any page within the range is mapped */
+        if (flags & MAP_EXCL) {
+            for (addr = start; addr < end; addr++) {
+                if (page_get_flags(addr) != 0)
+                    goto fail;
+            }
+        }

How about

    if ((flags & MAP_EXCL) &&
        page_check_range(start, len, 0) < 0) {
       goto fail;
    }

Hmm. This (and your page_get_flags check) could assert due to out-of-range guest address. You're currently attempting that,

        /*
         * Test if requested memory area fits target address space
         * It can fail only on 64-bit host with 32-bit target.
         * On any other target/host host mmap() handles this error correctly.
         */
#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
        if ((unsigned long)start + len - 1 > (abi_ulong) -1) {
            errno = EINVAL;
            goto fail;
        }
#endif

but the test isn't correct. Note that reserved_va may be applied to 64-bit guests, and certainly may be smaller than (abi_ulong)-1.

You want guest_range_valid_untagged here.


r~

Reply via email to