mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Christophe Leroy <christophe.leroy@csgroup.eu>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>,
	linux-kernel@vger.kernel.org, adhemerval.zanella@linaro.org,
	xry111@xry111.site
Subject: Re: [PATCH] selftests: vDSO: ensure vgetrandom works in a time namespace
Date: Mon, 9 Sep 2024 12:42:01 +0200	[thread overview]
Message-ID: <6c84d516-a3fd-4b9f-a27d-8da8ff117c92@csgroup.eu> (raw)
In-Reply-To: <20240905173220.2243959-1-Jason@zx2c4.com>

Hi Jason,

Le 05/09/2024 à 19:31, Jason A. Donenfeld a écrit :
> After verifying that vDSO getrandom does work, which ensures that the
> RNG is initialized, test to see if it also works inside of a time
> namespace. This is important to test, because the vvar pages get
> swizzled around there. If the arch code isn't careful, the RNG will
> appear uninitialized inside of a time namespace.
> 
> Because broken code implies that the RNG appears initialized, test that
> everything works by issuing a call to vgetrandom from a fork in a time
> namespace, and use ptrace to ensure that the actual syscall vgetrandom
> doesn't get called. If it doesn't get called, then the test succeeds.
> 
> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
> ---
>   .../selftests/vDSO/vdso_test_getrandom.c      | 41 ++++++++++++++++++-
>   1 file changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/vDSO/vdso_test_getrandom.c b/tools/testing/selftests/vDSO/vdso_test_getrandom.c
> index 8866b65a4605..dfda5061f454 100644
> --- a/tools/testing/selftests/vDSO/vdso_test_getrandom.c
> +++ b/tools/testing/selftests/vDSO/vdso_test_getrandom.c
> @@ -16,8 +16,11 @@
>   #include <sys/mman.h>
>   #include <sys/random.h>
>   #include <sys/syscall.h>
> +#include <sys/ptrace.h>
> +#include <sys/wait.h>
>   #include <sys/types.h>
>   #include <linux/random.h>
> +#include <linux/ptrace.h>
>   
>   #include "../kselftest.h"
>   #include "parse_vdso.h"
> @@ -239,9 +242,10 @@ static void fill(void)
>   static void kselftest(void)
>   {
>   	uint8_t weird_size[1263];
> +	pid_t child;
>   
>   	ksft_print_header();
> -	ksft_set_plan(1);
> +	ksft_set_plan(2);
>   
>   	for (size_t i = 0; i < 1000; ++i) {
>   		ssize_t ret = vgetrandom(weird_size, sizeof(weird_size), 0);
> @@ -250,6 +254,41 @@ static void kselftest(void)
>   	}
>   
>   	ksft_test_result_pass("getrandom: PASS\n");
> +
> +	assert(unshare(CLONE_NEWUSER) == 0 && unshare(CLONE_NEWTIME) == 0);

~# ./vdso_test_getrandom
TAP version 13
1..2
ok 1 getrandom: PASS
vdso_test_getrandom: vdso_test_getrandom.c:276: kselftest: Assertion 
`ret == 0' failed.
Aborted

That's too strong. When unshare() returns EINVAL it means the kernel is 
not built with CONFIG_TIME_NS. In that case the test should be SKIPPED.

And when unshare() returns EPERM, it means the user is not authorised to 
use unshare(), that's an expected error that shouldn't lead to an assert 
either, instead it should gracefully says FAILED I think.

> +	child = fork();
> +	assert(child >= 0);
> +	if (!child) {
> +		vgetrandom_init();
> +		child = getpid();
> +		assert(ptrace(PTRACE_TRACEME, 0, NULL, NULL) == 0);
> +		assert(kill(child, SIGSTOP) == 0);
> +		assert(vgetrandom(weird_size, sizeof(weird_size), 0) == sizeof(weird_size));
> +		_exit(0);
> +	}
> +	for (;;) {
> +		struct ptrace_syscall_info info = { 0 };
> +		int status, ret;
> +		assert(waitpid(child, &status, 0) >= 0);
> +		if (WIFEXITED(status)) {
> +			if (WEXITSTATUS(status) != 0)
> +				exit(KSFT_FAIL);
> +			break;
> +		}
> +		assert(WIFSTOPPED(status));
> +		if (WSTOPSIG(status) == SIGSTOP)
> +			assert(ptrace(PTRACE_SETOPTIONS, child, 0, PTRACE_O_TRACESYSGOOD) == 0);
> +		else if (WSTOPSIG(status) == SIGTRAP | 0x80) {
> +			assert(ptrace(PTRACE_GET_SYSCALL_INFO, child, sizeof(info), &info) > 0);
> +			if (info.entry.nr == __NR_getrandom &&
> +			    (info.entry.args[0] == (uintptr_t)&weird_size && info.entry.args[1] == sizeof(weird_size)))
> +				exit(KSFT_FAIL);
> +		}
> +		assert(ptrace(PTRACE_SYSCALL, child, 0, 0) == 0);
> +	}
> +
> +	ksft_test_result_pass("getrandom timens: PASS\n");
> +
>   	exit(KSFT_PASS);
>   }
>   

  reply	other threads:[~2024-09-09 10:42 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-02 19:17 [PATCH v5 0/5] Wire up getrandom() vDSO implementation on powerpc Christophe Leroy
2024-09-02 19:17 ` [PATCH v5 1/5] mm: Define VM_DROPPABLE for powerpc/32 Christophe Leroy
2024-09-02 19:17 ` [PATCH v5 2/5] powerpc/vdso32: Add crtsavres Christophe Leroy
2024-09-02 19:17 ` [PATCH v5 3/5] powerpc/vdso: Refactor CFLAGS for CVDSO build Christophe Leroy
2024-09-02 19:17 ` [PATCH v5 4/5] powerpc/vdso: Wire up getrandom() vDSO implementation on VDSO32 Christophe Leroy
2024-09-05 16:13   ` Jason A. Donenfeld
2024-09-05 16:25     ` Jason A. Donenfeld
2024-09-05 16:55     ` Christophe Leroy
2024-09-05 17:01       ` Xi Ruoyao
2024-09-05 17:03       ` Jason A. Donenfeld
2024-09-05 17:16         ` Jason A. Donenfeld
2024-09-05 17:31           ` [PATCH] selftests: vDSO: ensure vgetrandom works in a time namespace Jason A. Donenfeld
2024-09-09 10:42             ` Christophe Leroy [this message]
2024-09-09 12:57               ` Jason A. Donenfeld
2024-09-05 20:41     ` [PATCH v5 4/5] powerpc/vdso: Wire up getrandom() vDSO implementation on VDSO32 Jason A. Donenfeld
2024-09-06  2:48       ` Jason A. Donenfeld
2024-09-06  3:24         ` Jason A. Donenfeld
2024-09-06  4:53           ` Christophe Leroy
2024-09-02 19:17 ` [PATCH v5 5/5] powerpc/vdso: Wire up getrandom() vDSO implementation on VDSO64 Christophe Leroy
2024-09-04 11:46   ` Madhavan Srinivasan
2024-09-04 14:16 ` [PATCH v5 0/5] Wire up getrandom() vDSO implementation on powerpc Jason A. Donenfeld
2024-09-04 14:36   ` Christophe Leroy
2024-09-05 12:18   ` Michael Ellerman
2024-09-05 12:56     ` Jason A. Donenfeld

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6c84d516-a3fd-4b9f-a27d-8da8ff117c92@csgroup.eu \
    --to=christophe.leroy@csgroup.eu \
    --cc=Jason@zx2c4.com \
    --cc=adhemerval.zanella@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=xry111@xry111.site \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®