[LTP] [PATCH] open_posix_testsuite/mmap24-2: Support mips

Hongzhi, Song hongzhi.song@windriver.com
Thu Nov 1 02:49:25 CET 2018


Hi guys,

Referring to POSIX spec, the return values, EINVAL and ENOMEM,

are all right if MAP_FIXED is set. So I think Mips also keep to POSIX.


Please review this patch.


--Hongzhi


On 10/24/2018 10:36 AM, Hongzhi.Song wrote:
> Mips will return EINVAL instead of ENOMEM as expected
> if MAP_FIXED is set and the range of [addr + len) exceeds
> TASK_SIZE.
>
> Linux kernel code: arch/mips/mm/mmap.c
> if (flags & MAP_FIXED) {
>      /* Even MAP_FIXED mappings must reside within TASK_SIZE */
>      if (TASK_SIZE - len < addr)
>          return -EINVAL;
>
> The POSIX specification says:
> "If MAP_FIXED is set, mmap() may return MAP_FAILED and set errno to
> [EINVAL]."
> [http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]
>
> So I think the mips kernel remains POSIX compliant.
>
> Relax the condition and accept both ENOMEM and EINVAL
> as expected outcome.
>
> Signed-off-by: Hongzhi.Song <hongzhi.song@windriver.com>
> ---
>   .../open_posix_testsuite/conformance/interfaces/mmap/24-2.c    | 10 +++++-----
>   1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c b/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c
> index de51d43..810e5c8 100644
> --- a/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c
> +++ b/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c
> @@ -7,7 +7,7 @@
>    * source tree.
>    *
>    * The mmap() function shall fail if:
> - * [ENOMEM] MAP_FIXED was specified,
> + * [ENOMEM or EINVAL] MAP_FIXED was specified,
>    * and the range [addr,addr+len) exceeds that allowed
>    * for the address space of a process; or, if MAP_FIXED was not specified and
>    * there is insufficient room in the address space to effect the mapping.
> @@ -15,7 +15,7 @@
>    * Test Step:
>    * 1. Map a shared memory object, with size exceeding the value get from
>    *    rlim_cur of resource RLIMIT_AS, setting MAP_FIXED;
> - * 3. Should get ENOMEM.
> + * 3. Should get ENOMEM or EINVAL.
>    */
>   
>   #define _XOPEN_SOURCE 600
> @@ -93,8 +93,8 @@ int main(void)
>   	       (unsigned long)len);
>   	pa = mmap(addr, len, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd,
>   		  0);
> -	if (pa == MAP_FAILED && errno == ENOMEM) {
> -		printf("Got ENOMEM: %s\nTest PASSED\n", strerror(errno));
> +	if (pa == MAP_FAILED && (errno == ENOMEM || errno == EINVAL)) {
> +		printf("Got ENOMEM or EINVAL: %s\nTest PASSED\n", strerror(errno));
>   		exit(PTS_PASS);
>   	}
>   
> @@ -103,6 +103,6 @@ int main(void)
>   	else
>   		munmap(pa, len);
>   	close(fd);
> -	printf("Test Fail: Did not get ENOMEM as expected\n");
> +	printf("Test Failed: Did not get ENOMEM or EINVAL as expected\n");
>   	return PTS_FAIL;
>   }



More information about the ltp mailing list