From e4000d5407abf1da20f268c53b71c2ba3723e262 Mon Sep 17 00:00:00 2001 From: Timo Sirainen <timo.sirainen@open-xchange.com> Date: Wed, 31 May 2023 22:42:04 +0300 Subject: [PATCH] managesieve-login: Improve error handling if dump-capability process hangs --- .../managesieve-login-settings-plugin.c | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/managesieve-login/managesieve-login-settings-plugin.c b/src/managesieve-login/managesieve-login-settings-plugin.c index 50746f799..f4aa47766 100644 --- a/src/managesieve-login/managesieve-login-settings-plugin.c +++ b/src/managesieve-login/managesieve-login-settings-plugin.c @@ -13,6 +13,7 @@ #include <stddef.h> #include <unistd.h> +#include <time.h> #include <sys/wait.h> #include <sysexits.h> @@ -154,13 +155,26 @@ static bool capability_dump(void) (void)close(fd[1]); + time_t start_time = time(NULL); alarm(60); - if (wait(&status) == -1) { - i_error("managesieve-login: dump-capability failed: process %d got stuck", - (int)pid); + pid_t wait_ret = wait(&status); + alarm(0); + + if (wait_ret >= 0) + ; /* success */ + else if (errno != ECHILD) { + i_error("managesieve-login: dump-capability failed: " + "wait() failed: %m"); + return FALSE; + } else { + i_error("managesieve-login: dump-capability failed: " + "process %d got stuck (waited %"PRIdTIME_T" seconds) - " + "killing sig SIGABRT", + (int)pid, (time(NULL) - start_time)); + if (kill(pid, SIGABRT) < 0) + i_error("kill(%d) failed: %m", (int)pid); return FALSE; } - alarm(0); if (status != 0) { (void)close(fd[0]); -- GitLab