diff --git a/src/managesieve-login/managesieve-login-settings-plugin.c b/src/managesieve-login/managesieve-login-settings-plugin.c index 50746f799b5e916efcd2ad6b29a0bcbf5b72f6c3..f4aa47766a80c5eedea46bca8c2698eff046b50e 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]);