From 6fb02c73ab7287b28058052b4aa9d86710ee72c4 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 21 May 2025 15:57:04 +0200 Subject: [PATCH] daemon keepalive: fix waitpid EINTR handling --- src/daemon.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/daemon.c b/src/daemon.c index ceca4d0c..99563977 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -137,20 +137,19 @@ static void keepalive(void (*work)(void *data), void *data) /* enable signalling in kill_child_handler */ child_pid = p; - p1 = waitpid(p, &status, 0); + // wait for child to finish and check status + while ((p1 = waitpid(p, &status, 0) == (pid_t ) (-1)) && errno == EINTR) + ; + + if (p1 == (pid_t) (-1)) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "waitpid"); + break; + } /* disable signalling in kill_child_handler */ child_pid = 0; - if (p1 == (pid_t)(-1)) - { - if (errno != EINTR) - { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "waitpid"); - break; - } - continue; - } if (p1 != p) { yaz_log(YLOG_FATAL, "p1=%d != p=%d", p1, p);