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]);