[PATCH for-9.1] linux-user: Preserve NULL hit in target_mmap subroutines

Richard Henderson posted 1 patch 3 months, 1 week ago
linux-user/mmap.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
[PATCH for-9.1] linux-user: Preserve NULL hit in target_mmap subroutines
Posted by Richard Henderson 3 months, 1 week ago
Do not pass guest_base to the host mmap instead of zero hint.

Cc: qemu-stable@nongnu.org
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2353
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/mmap.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index 4d09a72fad..6418e811f6 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -560,9 +560,13 @@ static abi_long mmap_h_eq_g(abi_ulong start, abi_ulong len,
                             int host_prot, int flags, int page_flags,
                             int fd, off_t offset)
 {
-    void *p, *want_p = g2h_untagged(start);
+    void *p, *want_p = NULL;
     abi_ulong last;
 
+    if (start || (flags & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
+        want_p = g2h_untagged(start);
+    }
+
     p = mmap(want_p, len, host_prot, flags, fd, offset);
     if (p == MAP_FAILED) {
         return -1;
@@ -610,11 +614,15 @@ static abi_long mmap_h_lt_g(abi_ulong start, abi_ulong len, int host_prot,
                             int mmap_flags, int page_flags, int fd,
                             off_t offset, int host_page_size)
 {
-    void *p, *want_p = g2h_untagged(start);
+    void *p, *want_p = NULL;
     off_t fileend_adj = 0;
     int flags = mmap_flags;
     abi_ulong last, pass_last;
 
+    if (start || (flags & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
+        want_p = g2h_untagged(start);
+    }
+
     if (!(flags & MAP_ANONYMOUS)) {
         struct stat sb;
 
@@ -740,12 +748,16 @@ static abi_long mmap_h_gt_g(abi_ulong start, abi_ulong len,
                             int flags, int page_flags, int fd,
                             off_t offset, int host_page_size)
 {
-    void *p, *want_p = g2h_untagged(start);
+    void *p, *want_p = NULL;
     off_t host_offset = offset & -host_page_size;
     abi_ulong last, real_start, real_last;
     bool misaligned_offset = false;
     size_t host_len;
 
+    if (start || (flags & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
+        want_p = g2h_untagged(start);
+    }
+
     if (!(flags & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
         /*
          * Adjust the offset to something representable on the host.
-- 
2.43.0
Re: [PATCH for-9.1] linux-user: Preserve NULL hit in target_mmap subroutines
Posted by Philippe Mathieu-Daudé 3 months, 1 week ago
On 13/8/24 11:46, Richard Henderson wrote:
> Do not pass guest_base to the host mmap instead of zero hint.
> 
> Cc: qemu-stable@nongnu.org
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2353
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/mmap.c | 18 +++++++++++++++---
>   1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index 4d09a72fad..6418e811f6 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -560,9 +560,13 @@ static abi_long mmap_h_eq_g(abi_ulong start, abi_ulong len,
>                               int host_prot, int flags, int page_flags,
>                               int fd, off_t offset)
>   {
> -    void *p, *want_p = g2h_untagged(start);
> +    void *p, *want_p = NULL;
>       abi_ulong last;
>   
> +    if (start || (flags & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
> +        want_p = g2h_untagged(start);
> +    }
> +
>       p = mmap(want_p, len, host_prot, flags, fd, offset);
>       if (p == MAP_FAILED) {
>           return -1;
> @@ -610,11 +614,15 @@ static abi_long mmap_h_lt_g(abi_ulong start, abi_ulong len, int host_prot,
>                               int mmap_flags, int page_flags, int fd,
>                               off_t offset, int host_page_size)
>   {
> -    void *p, *want_p = g2h_untagged(start);
 > +    void *p, *want_p = NULL;

Maybe extract as static helper?

       void *p, *want_p = g2h_untagged_FOO(start, flags);

>       off_t fileend_adj = 0;
>       int flags = mmap_flags;
>       abi_ulong last, pass_last;
>   
> +    if (start || (flags & (MAP_FIXED | MAP_FIXED_NOREPLACE))) {
> +        want_p = g2h_untagged(start);
> +    }

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>