mirror of https://github.com/torvalds/linux.git
selftests: check pidfd_info->coredump_code correctness
Extend the coredump_socket and coredump_socket_protocol selftests to verify that the field coredump_code is set as expected in struct pidfd_info. Signed-off-by: Emanuele Rocca <emanuele.rocca@arm.com> Link: https://patch.msgid.link/acE6Eyuv2MM75pmk@NH27D9T0LF Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
701f7f4fba
commit
7aaa4915cb
|
|
@ -1004,6 +1004,8 @@ TEST_F(coredump, socket_request_invalid_size_large)
|
|||
*
|
||||
* Verify that when using socket-based coredump protocol,
|
||||
* the coredump_signal field is correctly exposed as SIGSEGV.
|
||||
* Also check that the coredump_code field is correctly exposed
|
||||
* as SEGV_MAPERR.
|
||||
*/
|
||||
TEST_F(coredump, socket_coredump_signal_sigsegv)
|
||||
{
|
||||
|
|
@ -1079,6 +1081,18 @@ TEST_F(coredump, socket_coredump_signal_sigsegv)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* Verify coredump_code is available and correct */
|
||||
if (!(info.mask & PIDFD_INFO_COREDUMP_CODE)) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigsegv: PIDFD_INFO_COREDUMP_CODE not set in mask\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (info.coredump_code != SEGV_MAPERR) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigsegv: coredump_code=%d, expected SEGV_MAPERR=%d\n",
|
||||
info.coredump_code, SEGV_MAPERR);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!read_coredump_req(fd_coredump, &req)) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigsegv: read_coredump_req failed\n");
|
||||
goto out;
|
||||
|
|
@ -1128,6 +1142,8 @@ TEST_F(coredump, socket_coredump_signal_sigsegv)
|
|||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP));
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_SIGNAL));
|
||||
ASSERT_EQ(info.coredump_signal, SIGSEGV);
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_CODE));
|
||||
ASSERT_EQ(info.coredump_code, SEGV_MAPERR);
|
||||
|
||||
wait_and_check_coredump_server(pid_coredump_server, _metadata, self);
|
||||
}
|
||||
|
|
@ -1137,6 +1153,8 @@ TEST_F(coredump, socket_coredump_signal_sigsegv)
|
|||
*
|
||||
* Verify that when using socket-based coredump protocol,
|
||||
* the coredump_signal field is correctly exposed as SIGABRT.
|
||||
* Also check that the coredump_code field is correctly exposed
|
||||
* as SI_TKILL.
|
||||
*/
|
||||
TEST_F(coredump, socket_coredump_signal_sigabrt)
|
||||
{
|
||||
|
|
@ -1212,6 +1230,12 @@ TEST_F(coredump, socket_coredump_signal_sigabrt)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (info.coredump_code != SI_TKILL) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigabrt: coredump_code=%d, expected SI_TKILL=%d\n",
|
||||
info.coredump_code, SI_TKILL);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!read_coredump_req(fd_coredump, &req)) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigabrt: read_coredump_req failed\n");
|
||||
goto out;
|
||||
|
|
@ -1261,6 +1285,8 @@ TEST_F(coredump, socket_coredump_signal_sigabrt)
|
|||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP));
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_SIGNAL));
|
||||
ASSERT_EQ(info.coredump_signal, SIGABRT);
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_CODE));
|
||||
ASSERT_EQ(info.coredump_code, SI_TKILL);
|
||||
|
||||
wait_and_check_coredump_server(pid_coredump_server, _metadata, self);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -435,6 +435,8 @@ TEST_F(coredump, socket_no_listener)
|
|||
*
|
||||
* Verify that when using simple socket-based coredump (@ pattern),
|
||||
* the coredump_signal field is correctly exposed as SIGSEGV.
|
||||
* Also check that the coredump_code field is correctly exposed
|
||||
* as SEGV_MAPERR.
|
||||
*/
|
||||
TEST_F(coredump, socket_coredump_signal_sigsegv)
|
||||
{
|
||||
|
|
@ -509,6 +511,18 @@ TEST_F(coredump, socket_coredump_signal_sigsegv)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* Verify coredump_code is available and correct */
|
||||
if (!(info.mask & PIDFD_INFO_COREDUMP_CODE)) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigsegv: PIDFD_INFO_COREDUMP_CODE not set in mask\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (info.coredump_code != SEGV_MAPERR) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigsegv: coredump_code=%d, expected SEGV_MAPERR=%d\n",
|
||||
info.coredump_code, SEGV_MAPERR);
|
||||
goto out;
|
||||
}
|
||||
|
||||
fd_core_file = open_coredump_tmpfile(self->fd_tmpfs_detached);
|
||||
if (fd_core_file < 0) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigsegv: open_coredump_tmpfile failed: %m\n");
|
||||
|
|
@ -572,6 +586,8 @@ TEST_F(coredump, socket_coredump_signal_sigsegv)
|
|||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP));
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_SIGNAL));
|
||||
ASSERT_EQ(info.coredump_signal, SIGSEGV);
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_CODE));
|
||||
ASSERT_EQ(info.coredump_code, SEGV_MAPERR);
|
||||
|
||||
wait_and_check_coredump_server(pid_coredump_server, _metadata, self);
|
||||
}
|
||||
|
|
@ -581,6 +597,8 @@ TEST_F(coredump, socket_coredump_signal_sigsegv)
|
|||
*
|
||||
* Verify that when using simple socket-based coredump (@ pattern),
|
||||
* the coredump_signal field is correctly exposed as SIGABRT.
|
||||
* Also check that the coredump_code field is correctly exposed
|
||||
* as SI_TKILL.
|
||||
*/
|
||||
TEST_F(coredump, socket_coredump_signal_sigabrt)
|
||||
{
|
||||
|
|
@ -655,6 +673,18 @@ TEST_F(coredump, socket_coredump_signal_sigabrt)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* Verify coredump_code is available and correct */
|
||||
if (!(info.mask & PIDFD_INFO_COREDUMP_CODE)) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigabrt: PIDFD_INFO_COREDUMP_CODE not set in mask\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (info.coredump_code != SI_TKILL) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigabrt: coredump_code=%d, expected SI_TKILL=%d\n",
|
||||
info.coredump_code, SI_TKILL);
|
||||
goto out;
|
||||
}
|
||||
|
||||
fd_core_file = open_coredump_tmpfile(self->fd_tmpfs_detached);
|
||||
if (fd_core_file < 0) {
|
||||
fprintf(stderr, "socket_coredump_signal_sigabrt: open_coredump_tmpfile failed: %m\n");
|
||||
|
|
@ -718,6 +748,8 @@ TEST_F(coredump, socket_coredump_signal_sigabrt)
|
|||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP));
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_SIGNAL));
|
||||
ASSERT_EQ(info.coredump_signal, SIGABRT);
|
||||
ASSERT_TRUE(!!(info.mask & PIDFD_INFO_COREDUMP_CODE));
|
||||
ASSERT_EQ(info.coredump_code, SI_TKILL);
|
||||
|
||||
wait_and_check_coredump_server(pid_coredump_server, _metadata, self);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -148,8 +148,8 @@ bool get_pidfd_info(int fd_peer_pidfd, struct pidfd_info *info)
|
|||
fprintf(stderr, "get_pidfd_info: ioctl(PIDFD_GET_INFO) failed: %m\n");
|
||||
return false;
|
||||
}
|
||||
fprintf(stderr, "get_pidfd_info: mask=0x%llx, coredump_mask=0x%x, coredump_signal=%d\n",
|
||||
(unsigned long long)info->mask, info->coredump_mask, info->coredump_signal);
|
||||
fprintf(stderr, "get_pidfd_info: mask=0x%llx, coredump_mask=0x%x, coredump_signal=%d, coredump_code=%d\n",
|
||||
(unsigned long long)info->mask, info->coredump_mask, info->coredump_signal, info->coredump_code);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -156,6 +156,10 @@
|
|||
#define PIDFD_INFO_COREDUMP_SIGNAL (1UL << 6)
|
||||
#endif
|
||||
|
||||
#ifndef PIDFD_INFO_COREDUMP_CODE
|
||||
#define PIDFD_INFO_COREDUMP_CODE (1UL << 7)
|
||||
#endif
|
||||
|
||||
#ifndef PIDFD_COREDUMPED
|
||||
#define PIDFD_COREDUMPED (1U << 0) /* Did crash and... */
|
||||
#endif
|
||||
|
|
@ -194,6 +198,7 @@ struct pidfd_info {
|
|||
struct {
|
||||
__u32 coredump_mask;
|
||||
__u32 coredump_signal;
|
||||
__u32 coredump_code;
|
||||
};
|
||||
__u64 supported_mask;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -724,6 +724,7 @@ TEST(supported_mask_field)
|
|||
ASSERT_TRUE(!!(info.supported_mask & PIDFD_INFO_COREDUMP));
|
||||
ASSERT_TRUE(!!(info.supported_mask & PIDFD_INFO_SUPPORTED_MASK));
|
||||
ASSERT_TRUE(!!(info.supported_mask & PIDFD_INFO_COREDUMP_SIGNAL));
|
||||
ASSERT_TRUE(!!(info.supported_mask & PIDFD_INFO_COREDUMP_CODE));
|
||||
|
||||
/* Clean up */
|
||||
sys_pidfd_send_signal(pidfd, SIGKILL, NULL, 0);
|
||||
|
|
|
|||
Loading…
Reference in New Issue