Skip to content

Commit

Permalink
linux-user: Use MAP_FIXED_NOREPLACE for do_brk()
Browse files Browse the repository at this point in the history
MAP_FIXED_NOREPLACE can ensure the mapped address is fixed without
concerning that the new mapping overwrites something else.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20230802071754.14876-5-akihiko.odaki@daynix.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
akihikodaki authored and rth7680 committed Aug 6, 2023
1 parent c6cc059 commit e69e032
Showing 1 changed file with 2 additions and 13 deletions.
15 changes: 2 additions & 13 deletions linux-user/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -854,17 +854,12 @@ abi_long do_brk(abi_ulong brk_val)
return target_brk;
}

/* We need to allocate more memory after the brk... Note that
* we don't use MAP_FIXED because that will map over the top of
* any existing mapping (like the one with the host libc or qemu
* itself); instead we treat "mapped but at wrong address" as
* a failure and unmap again.
*/
if (new_host_brk_page > brk_page) {
new_alloc_size = new_host_brk_page - brk_page;
mapped_addr = target_mmap(brk_page, new_alloc_size,
PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
MAP_FIXED_NOREPLACE | MAP_ANON | MAP_PRIVATE,
-1, 0);
} else {
new_alloc_size = 0;
mapped_addr = brk_page;
Expand All @@ -883,12 +878,6 @@ abi_long do_brk(abi_ulong brk_val)
target_brk = brk_val;
brk_page = new_host_brk_page;
return target_brk;
} else if (mapped_addr != -1) {
/* Mapped but at wrong address, meaning there wasn't actually
* enough space for this brk.
*/
target_munmap(mapped_addr, new_alloc_size);
mapped_addr = -1;
}

#if defined(TARGET_ALPHA)
Expand Down

0 comments on commit e69e032

Please sign in to comment.