Le 28/10/2020 à 22:38, Tobias Koch a écrit :
> If mremap succeeds, an additional check is performed to ensure that the
> new address range fits into the target address space. This check was
> previously perfomed in host address space, with the upper bound fixed to
> abi_ulong.
> 
> This patch replaces the static check with a call to `guest_range_valid`,
> performing the range check against the actual size of the target address
> space. It also moves the corresponding block to prevent it from being
> called incorrectly when the mapping itself fails.
> 
> Signed-off-by: Tobias Koch <tobias.k...@nonterra.com>
> ---
>  linux-user/mmap.c | 21 ++++++++++++---------
>  1 file changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index f261563420..101bd013a1 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -751,20 +751,23 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong 
> old_size,
>          }
>          if (prot == 0) {
>              host_addr = mremap(g2h(old_addr), old_size, new_size, flags);
> -            if (host_addr != MAP_FAILED && reserved_va && old_size > 
> new_size) {
> -                mmap_reserve(old_addr + old_size, old_size - new_size);
> +
> +            if (host_addr != MAP_FAILED) {
> +                /* Check if address fits target address space */
> +                if (!guest_range_valid(h2g(host_addr), new_size)) {
> +                    /* Revert mremap() changes */
> +                    host_addr = mremap(g2h(old_addr), new_size, old_size,
> +                                       flags);
> +                    errno = ENOMEM;
> +                    host_addr = MAP_FAILED;
> +                } else if (reserved_va && old_size > new_size) {
> +                    mmap_reserve(old_addr + old_size, old_size - new_size);
> +                }
>              }
>          } else {
>              errno = ENOMEM;
>              host_addr = MAP_FAILED;
>          }
> -        /* Check if address fits target address space */
> -        if ((unsigned long)host_addr + new_size > (abi_ulong)-1) {
> -            /* Revert mremap() changes */
> -            host_addr = mremap(g2h(old_addr), new_size, old_size, flags);
> -            errno = ENOMEM;
> -            host_addr = MAP_FAILED;
> -        }
>      }
>  
>      if (host_addr == MAP_FAILED) {
> 

Reviewed-by: Laurent Vivier <laur...@vivier.eu>

Reply via email to