From: Yu Watanabe Date: Sat, 20 Jan 2024 13:14:14 +0000 (+0900) Subject: journalctl: call all cleanup functions before raise() X-Git-Tag: v256-rc1~900^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F31028%2Fhead;p=thirdparty%2Fsystemd.git journalctl: call all cleanup functions before raise() Note, even with this, memory allocated internally by glibc is not freed. But, at least, memory explicitly allocated by us is freed cleanly even Ctrl-C is pressed during 'journalctl --follow'. Closes #30995. --- diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index d3ec22e224e..073dc1426ca 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -2726,19 +2726,12 @@ static int run(int argc, char *argv[]) { return r; sig = r; - /* unref signal event sources. */ - e = sd_event_unref(e); - r = update_cursor(j); if (r < 0) return r; /* re-send the original signal. */ - assert(SIGNAL_VALID(sig)); - if (raise(sig) < 0) - log_error("Failed to raise the original signal SIG%s, ignoring: %m", signal_to_string(sig)); - - return 0; + return sig; } r = show(&c); @@ -2763,4 +2756,4 @@ static int run(int argc, char *argv[]) { return 0; } -DEFINE_MAIN_FUNCTION(run); +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_SIGNAL(run); diff --git a/src/shared/generator.h b/src/shared/generator.h index a5dc2847d70..e5db1c17ce0 100644 --- a/src/shared/generator.h +++ b/src/shared/generator.h @@ -102,4 +102,5 @@ void log_setup_generator(void); impl(argv[1], \ argv[argc == 4 ? 2 : 1], \ argv[argc == 4 ? 3 : 1]), \ + exit_failure_if_negative, \ exit_failure_if_negative) diff --git a/src/shared/main-func.h b/src/shared/main-func.h index b3aff4cee77..d0689b42d9c 100644 --- a/src/shared/main-func.h +++ b/src/shared/main-func.h @@ -3,16 +3,22 @@ #include +#if HAVE_VALGRIND_VALGRIND_H +# include +#endif + #include "sd-daemon.h" #include "argv-util.h" +#include "hashmap.h" #include "pager.h" #include "selinux-util.h" +#include "signal-util.h" #include "spawn-ask-password-agent.h" #include "spawn-polkit-agent.h" #include "static-destruct.h" -#define _DEFINE_MAIN_FUNCTION(intro, impl, result_to_exit_status) \ +#define _DEFINE_MAIN_FUNCTION(intro, impl, result_to_exit_status, result_to_return_value) \ int main(int argc, char *argv[]) { \ int r; \ assert_se(argc > 0 && !isempty(argv[0])); \ @@ -28,7 +34,7 @@ pager_close(); \ mac_selinux_finish(); \ static_destruct(); \ - return result_to_exit_status(r); \ + return result_to_return_value(r); \ } static inline int exit_failure_if_negative(int result) { @@ -38,7 +44,7 @@ static inline int exit_failure_if_negative(int result) { /* Negative return values from impl are mapped to EXIT_FAILURE, and * everything else means success! */ #define DEFINE_MAIN_FUNCTION(impl) \ - _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_negative) + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_negative, exit_failure_if_negative) static inline int exit_failure_if_nonzero(int result) { return result < 0 ? EXIT_FAILURE : result; @@ -48,4 +54,28 @@ static inline int exit_failure_if_nonzero(int result) { * and positive values are propagated. * Note: "true" means failure! */ #define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(impl) \ - _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_nonzero) + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_nonzero, exit_failure_if_nonzero) + +static inline int raise_or_exit_status(int ret) { + if (ret < 0) + return EXIT_FAILURE; + if (ret == 0) + return EXIT_SUCCESS; + if (!SIGNAL_VALID(ret)) + return EXIT_FAILURE; + +#if HAVE_VALGRIND_VALGRIND_H + /* If raise() below succeeds, the destructor cleanup_pools() in hashmap.c will never called. */ + if (RUNNING_ON_VALGRIND) + hashmap_trim_pools(); +#endif + + (void) raise(ret); + /* exit with failure if raise() does not immediately abort the program. */ + return EXIT_FAILURE; +} + +/* Negative return values from impl are mapped to EXIT_FAILURE, zero is mapped to EXIT_SUCCESS, + * and raise if a positive signal is returned from impl. */ +#define DEFINE_MAIN_FUNCTION_WITH_POSITIVE_SIGNAL(impl) \ + _DEFINE_MAIN_FUNCTION(,impl(argc, argv), exit_failure_if_negative, raise_or_exit_status)