linux-user: Unset MAP_FIXED_NOREPLACE for host
Passing MAP_FIXED_NOREPLACE to host will fail for reserved_va because the address space is reserved with mmap. Replace it with MAP_FIXED in that case. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-Id: <20230802071754.14876-2-akihiko.odaki@daynix.com> [rth: Expand inline commentary.] Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
4333f0924c
commit
c3dd50da0f
@ -603,13 +603,28 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int target_prot,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (flags & MAP_FIXED_NOREPLACE) {
|
||||
/* Validate that the chosen range is empty. */
|
||||
if ((flags & MAP_FIXED_NOREPLACE)
|
||||
&& !page_check_range_empty(start, last)) {
|
||||
if (!page_check_range_empty(start, last)) {
|
||||
errno = EEXIST;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* With reserved_va, the entire address space is mmaped in the
|
||||
* host to ensure it isn't accidentally used for something else.
|
||||
* We have just checked that the guest address is not mapped
|
||||
* within the guest, but need to replace the host reservation.
|
||||
*
|
||||
* Without reserved_va, despite the guest address check above,
|
||||
* keep MAP_FIXED_NOREPLACE so that the guest does not overwrite
|
||||
* any host address mappings.
|
||||
*/
|
||||
if (reserved_va) {
|
||||
flags = (flags & ~MAP_FIXED_NOREPLACE) | MAP_FIXED;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* worst case: we cannot map the file because the offset is not
|
||||
* aligned, so we read it
|
||||
|
Loading…
Reference in New Issue
Block a user