*
* 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)
{
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;
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);
}
*
* 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)
{
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;
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);
}
*
* 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)
{
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");
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);
}
*
* 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)
{
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");
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);
}
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;
}
#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
struct {
__u32 coredump_mask;
__u32 coredump_signal;
+ __u32 coredump_code;
};
__u64 supported_mask;
};
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);