]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: systemd-wrapper: don't leak zombie processes
authorMarc-Antoine Perennou <Marc-Antoine@Perennou.com>
Tue, 2 Apr 2013 11:53:21 +0000 (13:53 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 2 Apr 2013 12:34:51 +0000 (14:34 +0200)
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 <Marc-Antoine@Perennou.com>
src/haproxy-systemd-wrapper.c

index 596801591b9e4b726d039e8a5571bfcea9f4e8d0..8499b35188c5c2931b931764cc8cce02690aa0cd 100644 (file)
 #include <unistd.h>
 #include <sys/wait.h>
 
-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;
 }