[LTP] [PATCH] mlock_8-1, munlock_10-1: don't use LONG_MAX as invalid pointer

Cyril Hrubis chrubis@suse.cz
Mon Oct 14 14:50:15 CEST 2019


Hi!
> arm64 kernel with commit 057d3389108e ("mm: untag user pointers passed to
> memory syscalls") will assume this is tagged user pointer and will
> attempt to clear first byte. This leads to test hitting different error
> (EINVAL instead of ENOMEM).
> 
> Add a helper function which provides invalid/unused pointer from user
> address space.
> 
> Signed-off-by: Jan Stancek <jstancek@redhat.com>
> ---
>  .../conformance/interfaces/mlock/8-1.c             | 11 ++--------
>  .../conformance/interfaces/munlock/10-1.c          | 11 ++--------
>  .../open_posix_testsuite/include/invalid_helpers.h | 25 ++++++++++++++++++++++
>  3 files changed, 29 insertions(+), 18 deletions(-)
>  create mode 100644 testcases/open_posix_testsuite/include/invalid_helpers.h
> 
> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/mlock/8-1.c b/testcases/open_posix_testsuite/conformance/interfaces/mlock/8-1.c
> index d9569008b82b..5883ff8ec162 100644
> --- a/testcases/open_posix_testsuite/conformance/interfaces/mlock/8-1.c
> +++ b/testcases/open_posix_testsuite/conformance/interfaces/mlock/8-1.c
> @@ -20,22 +20,15 @@
>  #include <errno.h>
>  #include <limits.h>
>  #include "posixtest.h"
> +#include "invalid_helpers.h"
>  
>  #define BUFSIZE 8
>  
>  int main(void)
>  {
>  	int result;
> -	long page_size;
> -	void *page_ptr;
> +	void *page_ptr = get_invalid_ptr();
>  
> -	page_size = sysconf(_SC_PAGESIZE);
> -	if (errno) {
> -		perror("An error occurs when calling sysconf()");
> -		return PTS_UNRESOLVED;
> -	}
> -
> -	page_ptr = (void *)(LONG_MAX - (LONG_MAX % page_size));
>  	result = mlock(page_ptr, BUFSIZE);
>  
>  	if (result == -1 && errno == ENOMEM) {
> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/munlock/10-1.c b/testcases/open_posix_testsuite/conformance/interfaces/munlock/10-1.c
> index cf870289b512..1bc3d8015808 100644
> --- a/testcases/open_posix_testsuite/conformance/interfaces/munlock/10-1.c
> +++ b/testcases/open_posix_testsuite/conformance/interfaces/munlock/10-1.c
> @@ -20,22 +20,15 @@
>  #include <errno.h>
>  #include <limits.h>
>  #include "posixtest.h"
> +#include "invalid_helpers.h"
>  
>  #define BUFSIZE 8
>  
>  int main(void)
>  {
>  	int result;
> -	long page_size;
> -	void *page_ptr;
> +	void *page_ptr = get_invalid_ptr();
>  
> -	page_size = sysconf(_SC_PAGESIZE);
> -	if (errno) {
> -		perror("An error occurs when calling sysconf()");
> -		return PTS_UNRESOLVED;
> -	}
> -
> -	page_ptr = (void *)(LONG_MAX - (LONG_MAX % page_size));
>  	result = munlock(page_ptr, BUFSIZE);
>  
>  	if (result == -1 && errno == ENOMEM) {
> diff --git a/testcases/open_posix_testsuite/include/invalid_helpers.h b/testcases/open_posix_testsuite/include/invalid_helpers.h
> new file mode 100644
> index 000000000000..7882c783abf6
> --- /dev/null
> +++ b/testcases/open_posix_testsuite/include/invalid_helpers.h
> @@ -0,0 +1,25 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later
> + * Copyright (c) 2019 Linux Test Project
> + */
> +
> +#ifndef __INVALID_HELPERS_H__
> +#define __INVALID_HELPERS_H__
            ^
	    Strictly speaking the double underscores are reserved for
	    low level code i.e. libc and related code so we should avoid
	    them.

> +#include <stdlib.h>
> +#include "safe_helpers.h"
> +
> +#define DISTANT_AREA_SIZE (128*1024*1024)
> +
> +static void *get_invalid_ptr(void)
> +{
> +	int page_size;
> +	void *ptr;
> +
> +	page_size = sysconf(_SC_PAGESIZE);
> +	SAFE_PFUNC(posix_memalign(&ptr, page_size, DISTANT_AREA_SIZE));
> +	free(ptr);
> +
> +	return (char *)ptr + (DISTANT_AREA_SIZE / 2);
> +}

Maybe it's worth of a comment what is the idea behind this code here.

> +#endif
> -- 
> 1.8.3.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list