ptrace: call wait only if PTRACE_SEIZE was successful

and print errno for the wait syscall in an error case

Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Andrey Vagin 2015-02-24 21:44:23 +03:00 committed by Pavel Emelyanov
parent 99801e72f0
commit d12317ded3

View file

@ -50,7 +50,7 @@ int seize_task(pid_t pid, pid_t ppid)
{
siginfo_t si;
int status;
int ret, ret2, ptrace_errno;
int ret, ret2, ptrace_errno, wait_errno = 0;
struct proc_status_creds cr;
ret = ptrace(PTRACE_SEIZE, pid, NULL, 0);
@ -81,7 +81,10 @@ int seize_task(pid_t pid, pid_t ppid)
*/
try_again:
ret = wait4(pid, &status, __WALL, NULL);
if (!ret) {
ret = wait4(pid, &status, __WALL, NULL);
wait_errno = errno;
}
ret2 = parse_pid_status(pid, &cr);
if (ret2)
@ -97,8 +100,8 @@ try_again:
if (pid == getpid())
pr_err("The criu itself is within dumped tree.\n");
else
pr_err("Unseizable non-zombie %d found, state %c, err %d/%d\n",
pid, cr.state, ret, ptrace_errno);
pr_err("Unseizable non-zombie %d found, state %c, err %d/%d/%d\n",
pid, cr.state, ret, ptrace_errno, wait_errno);
return -1;
}
@ -135,6 +138,7 @@ try_again:
goto err;
}
ret = 0;
goto try_again;
}