From 4d73712ef744adeade9377bb268867521b048655 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 9 Oct 2025 00:39:11 +0900 Subject: [PATCH] coredump: shortcut to start backtrace mode When running as backtrace mode, it is not necessary to use kmsg, not necessary to disable coredump from the command, and unexpectedly passed file descriptors can be silently ignored. --- src/coredump/coredump-backtrace.c | 1 + src/coredump/coredump.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/coredump/coredump-backtrace.c b/src/coredump/coredump-backtrace.c index 4e223e5220..4d80cae24c 100644 --- a/src/coredump/coredump-backtrace.c +++ b/src/coredump/coredump-backtrace.c @@ -18,6 +18,7 @@ int coredump_backtrace(int argc, char *argv[]) { assert(argc >= 2); + log_setup(); log_debug("Processing backtrace on stdin..."); iovw = iovw_new(); diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c index 6e110db630..c29976e281 100644 --- a/src/coredump/coredump.c +++ b/src/coredump/coredump.c @@ -13,9 +13,13 @@ static int run(int argc, char *argv[]) { int r; + /* When running as backtrace mode, it is not necessary to use kmsg, not necessary to disable coredump + * from the command, and unexpectedly passed file descriptors can be silently ignored. */ + if (streq_ptr(argv[1], "--backtrace")) + return coredump_backtrace(argc, argv); + /* First, log to a safe place, since we don't know what crashed and it might * be journald which we'd rather not log to then. */ - log_set_target_and_open(LOG_TARGET_KMSG); /* Make sure we never enter a loop */ @@ -25,14 +29,11 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to determine the number of file descriptors: %m"); - /* If we got an fd passed, we are running in coredumpd mode. Otherwise we - * are invoked from the kernel as coredump handler. */ - if (r == 0) { - if (streq_ptr(argv[1], "--backtrace")) - return coredump_backtrace(argc, argv); - else - return coredump_kernel_helper(argc, argv); - } else if (r == 1) + /* If we got an fd passed, we are running in coredumpd mode. Otherwise we are invoked from the + * kernel as coredump handler. */ + if (r == 0) + return coredump_kernel_helper(argc, argv); + if (r == 1) return coredump_receive(SD_LISTEN_FDS_START); return log_error_errno(SYNTHETIC_ERRNO(EINVAL),