From 3584aa90227e3361a5cddfe607b68fcad8cb00ad Mon Sep 17 00:00:00 2001 From: zhangyaqi Date: Thu, 14 Mar 2024 15:01:29 +0800 Subject: [PATCH] fix do not go into freeze when systemd crashd --- ...t-go-into-freeze-when-systemd-crashd.patch | 99 +++++++++++++++++++ systemd.spec | 6 +- 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 fix-do-not-go-into-freeze-when-systemd-crashd.patch diff --git a/fix-do-not-go-into-freeze-when-systemd-crashd.patch b/fix-do-not-go-into-freeze-when-systemd-crashd.patch new file mode 100644 index 0000000..f103f39 --- /dev/null +++ b/fix-do-not-go-into-freeze-when-systemd-crashd.patch @@ -0,0 +1,99 @@ +From b25bcef0a4f23c8a38afb9875e4c90448a048774 Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Thu, 14 Mar 2024 13:58:56 +0800 +Subject: [PATCH] fix Do not go into freeze when systemd crashd + +--- + src/core/main.c | 41 +++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 39 insertions(+), 2 deletions(-) + +diff --git a/src/core/main.c b/src/core/main.c +index 754d1c1..752d975 100644 +--- a/src/core/main.c ++++ b/src/core/main.c +@@ -4,6 +4,8 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -165,6 +167,9 @@ static char *arg_default_unit_slice = NULL; + static usec_t arg_clock_usec; + static void *arg_random_seed; + static size_t arg_random_seed_size; ++static bool reexec_jmp_can = false; ++static bool reexec_jmp_inited = false; ++static sigjmp_buf reexec_jmp_buf; + + /* A copy of the original environment block */ + static char **saved_env = NULL; +@@ -202,6 +207,34 @@ static int manager_find_user_config_paths(char ***ret_files, char ***ret_dirs) { + return 0; + } + ++static void reexec_handler(int sig) { ++ reexec_jmp_can = true; ++} ++ ++_noreturn_ static void freeze_wait_upgrade(void) { ++ struct sigaction sa; ++ sigset_t ss; ++ ++ sigemptyset(&ss); ++ sigaddset(&ss, SIGTERM); ++ sigprocmask(SIG_UNBLOCK, &ss, NULL); ++ ++ sa.sa_handler = reexec_handler; ++ sa.sa_flags = SA_RESTART; ++ sigaction(SIGTERM, &sa, NULL); ++ ++ log_error("freeze_wait_upgrade: %d\n", reexec_jmp_inited); ++ reexec_jmp_can = false; ++ while(1) { ++ usleep(10000); ++ if (reexec_jmp_inited && reexec_jmp_can) { ++ log_error("goto manager_reexecute.\n"); ++ siglongjmp(reexec_jmp_buf, 1); ++ } ++ waitpid(-1, NULL, WNOHANG); ++ } ++} ++ + _noreturn_ static void freeze_or_exit_or_reboot(void) { + + /* If we are running in a container, let's prefer exiting, after all we can propagate an exit code to +@@ -221,7 +254,7 @@ _noreturn_ static void freeze_or_exit_or_reboot(void) { + } + + log_emergency("Freezing execution."); +- freeze(); ++ freeze_wait_upgrade(); + } + + _noreturn_ static void crash(int sig, siginfo_t *siginfo, void *context) { +@@ -1962,6 +1995,10 @@ static int invoke_main_loop( + assert(ret_switch_root_init); + assert(ret_error_message); + ++ reexec_jmp_inited = true; ++ if (sigsetjmp(reexec_jmp_buf, 1)) ++ goto manager_reexecute; ++ + for (;;) { + r = manager_loop(m); + if (r < 0) { +@@ -2007,7 +2044,7 @@ static int invoke_main_loop( + } + + case MANAGER_REEXECUTE: +- ++manager_reexecute: + r = prepare_reexecute(m, &arg_serialization, ret_fds, false); + if (r < 0) { + *ret_error_message = "Failed to prepare for reexecution"; +-- +2.41.0 + diff --git a/systemd.spec b/systemd.spec index c51e166..9506327 100644 --- a/systemd.spec +++ b/systemd.spec @@ -21,7 +21,7 @@ Name: systemd Url: https://www.freedesktop.org/wiki/Software/systemd Version: 249 -Release: 73 +Release: 74 License: MIT and LGPLv2+ and GPLv2+ Summary: System and Service Manager @@ -701,6 +701,7 @@ Patch9801: Systemd-Add-sw64-architecture.patch Patch9802: 0029-Add-support-for-the-LoongArch-architecture.patch Patch9803: 0030-Add-LoongArch-dmi-virt-detection-and-testcase.patch Patch9804: add-loongarch-for-missing_syscall_def.patch +Patch9805: fix-do-not-go-into-freeze-when-systemd-crashd.patch BuildRequires: gcc, gcc-c++ BuildRequires: libcap-devel, libmount-devel, pam-devel, libselinux-devel @@ -2140,6 +2141,9 @@ grep -q -E '^KEYMAP="?fi-latin[19]"?' /etc/vconsole.conf 2>/dev/null && %{_libdir}/security/pam_systemd.so %changelog +* Thu Mar 14 2024 zhangyaqi - 249-74 +- fix Do not go into freeze when systemd crashd + * Mon Mar 4 2024 huyubiao - 249-73 - move the architecture patches after Patch9800 (excluding Patch9800) delete the duplicate systemd-coredump.socket -- Gitee