[PATCH 15/22] selftests/coredump: fix userspace coredump client detection

Christian Brauner posted 22 patches 3 months, 1 week ago
[PATCH 15/22] selftests/coredump: fix userspace coredump client detection
Posted by Christian Brauner 3 months, 1 week ago
PIDFD_INFO_COREDUMP is only retrievable until the task has exited. After
it has exited task->mm is NULL. So if the task didn't actually coredump
we can't retrieve it's dumpability settings anymore. Only if the task
did coredump will we have stashed the coredump information in the
respective struct pid.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 tools/testing/selftests/coredump/coredump_socket_test.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/coredump/coredump_socket_test.c b/tools/testing/selftests/coredump/coredump_socket_test.c
index 658f3966064f..5103d9f13003 100644
--- a/tools/testing/selftests/coredump/coredump_socket_test.c
+++ b/tools/testing/selftests/coredump/coredump_socket_test.c
@@ -271,22 +271,26 @@ TEST_F(coredump, socket_detect_userspace_client)
 			_exit(EXIT_FAILURE);
 
 		close(fd_socket);
+		pause();
 		_exit(EXIT_SUCCESS);
 	}
 
 	pidfd = sys_pidfd_open(pid, 0);
 	ASSERT_GE(pidfd, 0);
 
-	waitpid(pid, &status, 0);
-	ASSERT_TRUE(WIFEXITED(status));
-	ASSERT_EQ(WEXITSTATUS(status), 0);
-
 	ASSERT_TRUE(get_pidfd_info(pidfd, &info));
 	ASSERT_GT((info.mask & PIDFD_INFO_COREDUMP), 0);
 	ASSERT_EQ((info.coredump_mask & PIDFD_COREDUMPED), 0);
 
 	wait_and_check_coredump_server(pid_coredump_server, _metadata, self);
 
+	ASSERT_EQ(sys_pidfd_send_signal(pidfd, SIGKILL, NULL, 0), 0);
+	ASSERT_EQ(close(pidfd), 0);
+
+	waitpid(pid, &status, 0);
+	ASSERT_TRUE(WIFSIGNALED(status));
+	ASSERT_EQ(WTERMSIG(status), SIGKILL);
+
 	ASSERT_NE(stat("/tmp/coredump.file", &st), 0);
 	ASSERT_EQ(errno, ENOENT);
 }

-- 
2.47.3
Re: [PATCH 15/22] selftests/coredump: fix userspace coredump client detection
Posted by Alexander Mikhalitsyn 3 months ago
Am Di., 28. Okt. 2025 um 09:47 Uhr schrieb Christian Brauner
<brauner@kernel.org>:
>
> PIDFD_INFO_COREDUMP is only retrievable until the task has exited. After
> it has exited task->mm is NULL. So if the task didn't actually coredump
> we can't retrieve it's dumpability settings anymore. Only if the task
> did coredump will we have stashed the coredump information in the
> respective struct pid.
>
> Signed-off-by: Christian Brauner <brauner@kernel.org>

Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>

> ---
>  tools/testing/selftests/coredump/coredump_socket_test.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/tools/testing/selftests/coredump/coredump_socket_test.c b/tools/testing/selftests/coredump/coredump_socket_test.c
> index 658f3966064f..5103d9f13003 100644
> --- a/tools/testing/selftests/coredump/coredump_socket_test.c
> +++ b/tools/testing/selftests/coredump/coredump_socket_test.c
> @@ -271,22 +271,26 @@ TEST_F(coredump, socket_detect_userspace_client)
>                         _exit(EXIT_FAILURE);
>
>                 close(fd_socket);
> +               pause();
>                 _exit(EXIT_SUCCESS);
>         }
>
>         pidfd = sys_pidfd_open(pid, 0);
>         ASSERT_GE(pidfd, 0);
>
> -       waitpid(pid, &status, 0);
> -       ASSERT_TRUE(WIFEXITED(status));
> -       ASSERT_EQ(WEXITSTATUS(status), 0);
> -
>         ASSERT_TRUE(get_pidfd_info(pidfd, &info));
>         ASSERT_GT((info.mask & PIDFD_INFO_COREDUMP), 0);
>         ASSERT_EQ((info.coredump_mask & PIDFD_COREDUMPED), 0);
>
>         wait_and_check_coredump_server(pid_coredump_server, _metadata, self);
>
> +       ASSERT_EQ(sys_pidfd_send_signal(pidfd, SIGKILL, NULL, 0), 0);
> +       ASSERT_EQ(close(pidfd), 0);
> +
> +       waitpid(pid, &status, 0);
> +       ASSERT_TRUE(WIFSIGNALED(status));
> +       ASSERT_EQ(WTERMSIG(status), SIGKILL);
> +
>         ASSERT_NE(stat("/tmp/coredump.file", &st), 0);
>         ASSERT_EQ(errno, ENOENT);
>  }
>
> --
> 2.47.3
>