From: Marc-Antoine Perennou Date: Tue, 2 Apr 2013 11:53:21 +0000 (+0200) Subject: BUG/MEDIUM: systemd-wrapper: don't leak zombie processes X-Git-Tag: v1.5-dev18~35 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=47f922dd244a277cf41eba8bc93c9d660a884ed3;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: systemd-wrapper: don't leak zombie processes Formerly, if A was replaced by B, and then B by C before A finished exiting, we didn't wait for B to finish so it ended up as a zombie process. Fix this by waiting randomly every child we spawn. Signed-off-by: Marc-Antoine Perennou --- diff --git a/src/haproxy-systemd-wrapper.c b/src/haproxy-systemd-wrapper.c index 596801591b..8499b35188 100644 --- a/src/haproxy-systemd-wrapper.c +++ b/src/haproxy-systemd-wrapper.c @@ -19,12 +19,11 @@ #include #include -static pid_t pid = 0; static char *pid_file = "/run/haproxy.pid"; static int main_argc; static char **main_argv; -static pid_t spawn_haproxy(char **pid_strv, int nb_pid) +static void spawn_haproxy(char **pid_strv, int nb_pid) { pid_t pid = fork(); if (!pid) { @@ -45,7 +44,6 @@ static pid_t spawn_haproxy(char **pid_strv, int nb_pid) execv(argv[0], argv); exit(0); } - return pid; } static int read_pids(char ***pid_strv) @@ -77,7 +75,7 @@ static void signal_handler(int signum __attribute__((unused))) char **pid_strv = NULL; int nb_pid = read_pids(&pid_strv); - pid = spawn_haproxy(pid_strv, nb_pid); + spawn_haproxy(pid_strv, nb_pid); for (i = 0; i < nb_pid; ++i) free(pid_strv[i]); @@ -107,8 +105,8 @@ int main(int argc, char **argv) signal(SIGUSR2, &signal_handler); - pid = spawn_haproxy(NULL, 0); - while (-1 != waitpid(pid, NULL, 0) || errno == EINTR); + spawn_haproxy(NULL, 0); + while (-1 != wait(NULL) || errno == EINTR); return EXIT_SUCCESS; }