Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sun, 24 Jan 2021 10:40:27 -0500
From: Rich Felker <dalias@...c.org>
To: Andrew Rogers <andrew.rogerstech@...il.com>
Cc: musl@...ts.openwall.com
Subject: Re: Potential DL_NOMMU_SUPPORT bug.

On Sat, Jan 23, 2021 at 06:47:00AM +0000, Andrew Rogers wrote:
> Hi,
> 
> I was trying a DL_NOMMU_SUPPORT build so I could load binaries from the
> sdcard on an android device. I managed to succeed but only after making a
> mod which I later realised might apply beyond my application.
> 
> The mmap_fixed() function would return as if successful even when mmap()
> call had failed
> 
> Hopefully the link and the patch below help.
> 
> Regards
> Andrew
> 
> https://git.musl-libc.org/cgit/musl/tree/ldso/dynlink.c?id=85e0e3519655220688e757b9d5bfd314923548bd#n584
> 
> diff -Naur musl-1.2.2-orig/ldso/dynlink.c musl-1.2.2-new/ldso/dynlink.c
> --- musl-1.2.2-orig/ldso/dynlink.c 2021-01-15 02:26:00.000000000 +0000
> +++ musl-1.2.2-new/ldso/dynlink.c 2021-01-23 06:26:26.861158169 +0000
> @@ -581,7 +581,7 @@
>   char *q;
>   if (!no_map_fixed) {
>   q = mmap(p, n, prot, flags|MAP_FIXED, fd, off);
> - if (!DL_NOMMU_SUPPORT || q != MAP_FAILED || errno != EINVAL)
> + if (!DL_NOMMU_SUPPORT && q != MAP_FAILED && errno != EINVAL)
>   return q;
>   no_map_fixed = 1;
>   }

> diff -Naur musl-1.2.2-orig/ldso/dynlink.c musl-1.2.2-new/ldso/dynlink.c
> --- musl-1.2.2-orig/ldso/dynlink.c	2021-01-15 02:26:00.000000000 +0000
> +++ musl-1.2.2-new/ldso/dynlink.c	2021-01-23 06:26:26.861158169 +0000
> @@ -581,7 +581,7 @@
>  	char *q;
>  	if (!no_map_fixed) {
>  		q = mmap(p, n, prot, flags|MAP_FIXED, fd, off);
> -		if (!DL_NOMMU_SUPPORT || q != MAP_FAILED || errno != EINVAL)
> +		if (!DL_NOMMU_SUPPORT && q != MAP_FAILED && errno != EINVAL)
>  			return q;
>  		no_map_fixed = 1;
>  	}

The condition was correct as written. If any of the 3 are true, there
is no fallback to be done:

- If it's not an arch that could be nommu, mmap can be expected to
  work. Any error should be reported rather than attempting to
  emulate.

- If the return value isn't failure, it already succeeded, so of
  course you don't want to emulate on top of that.

- If the call failed but errno is something other than EINVAL (the
  error mmap returns on nommu when it can't do MAP_FIXED) then it's an
  error to report rather than emulating.

Could you clarify what you're trying to do? Android devices are not
nommu and loading the binary from SD card vs elsewhere should not be
relevant to mmap failure here.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.