mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
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:
@ -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)
|
||||||
|
Reference in New Issue
Block a user