rootless: avoid zombie process on first launch

avoid a zombie process if on the first launch Podman creates a long
living process, such as "podman system service -t 0".

The `r` variable was overriden thus causing the waitpid to fail and
not clean up the intermediate process.

Closes: https://github.com/containers/podman/issues/10575

[NO TESTS NEEDED]

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano
2021-07-29 10:21:25 +02:00
parent 1bf7a9ed9c
commit 724d048234

View File

@ -465,38 +465,43 @@ reexec_in_user_namespace_wait (int pid, int options)
static int static int
create_pause_process (const char *pause_pid_file_path, char **argv) create_pause_process (const char *pause_pid_file_path, char **argv)
{ {
int r, p[2]; pid_t pid;
int p[2];
if (pipe (p) < 0) if (pipe (p) < 0)
_exit (EXIT_FAILURE); return -1;
r = fork (); pid = fork ();
if (r < 0) if (pid < 0)
_exit (EXIT_FAILURE); {
close (p[0]);
close (p[1]);
return -1;
}
if (r) if (pid)
{ {
char b; char b;
int r;
close (p[1]); close (p[1]);
/* Block until we write the pid file. */ /* Block until we write the pid file. */
r = TEMP_FAILURE_RETRY (read (p[0], &b, 1)); r = TEMP_FAILURE_RETRY (read (p[0], &b, 1));
close (p[0]); close (p[0]);
reexec_in_user_namespace_wait (r, 0); reexec_in_user_namespace_wait (pid, 0);
return r == 1 && b == '0' ? 0 : -1; return r == 1 && b == '0' ? 0 : -1;
} }
else else
{ {
int fd; int r, fd;
pid_t pid;
close (p[0]); close (p[0]);
setsid (); setsid ();
pid = fork (); pid = fork ();
if (r < 0) if (pid < 0)
_exit (EXIT_FAILURE); _exit (EXIT_FAILURE);
if (pid) if (pid)