[CRIU] [PATCH] ptrace: call wait only if PTRACE_SEIZE was successful

Andrey Vagin avagin at openvz.org
Tue Feb 24 06:19:12 PST 2015


and print errno for the wait syscall in an error case

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 ptrace.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/ptrace.c b/ptrace.c
index 70290eb..be6b67b 100644
--- a/ptrace.c
+++ b/ptrace.c
@@ -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;
 	}
 
-- 
1.9.3



More information about the CRIU mailing list