From ce437d3dc568775f17727ecf7bfeea42ee6f7caa Mon Sep 17 00:00:00 2001 From: Dmitry Safonov Date: Tue, 27 Feb 2018 13:42:55 +0000 Subject: [PATCH] x86/kdat: Check PTRACE_TRACEME return value Coverity has informed: *** CID 188251: Error handling issues (CHECKED_RETURN) /criu/arch/x86/crtools.c: 196 in kdat_x86_has_ptrace_fpu_xsave_bug_child() 190 return 0; 191 } 192 #endif 193 194 static int kdat_x86_has_ptrace_fpu_xsave_bug_child(void *arg) 195 { >>> CID 188251: Error handling issues (CHECKED_RETURN) >>> Calling "ptrace" without checking return value (as is done elsewhere 46 out of 51 times). 196 ptrace(PTRACE_TRACEME, 0, 0, 0); 197 kill(getpid(), SIGSTOP); 198 pr_err("Continue after SIGSTOP.. Urr what?\n"); 199 _exit(1); 200 } 201 Also added checks for kill() and waitpid(). Signed-off-by: Dmitry Safonov Signed-off-by: Andrei Vagin --- criu/arch/x86/kerndat.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/criu/arch/x86/kerndat.c b/criu/arch/x86/kerndat.c index a67017d34..006196829 100644 --- a/criu/arch/x86/kerndat.c +++ b/criu/arch/x86/kerndat.c @@ -178,8 +178,14 @@ int kdat_compatible_cr(void) static int kdat_x86_has_ptrace_fpu_xsave_bug_child(void *arg) { - ptrace(PTRACE_TRACEME, 0, 0, 0); - kill(getpid(), SIGSTOP); + if (ptrace(PTRACE_TRACEME, 0, 0, 0)) { + pr_perror("%d: ptrace(PTRACE_TRACEME) failed", getpid()); + _exit(1); + } + + if (kill(getpid(), SIGSTOP)) + pr_perror("%d: failed to kill myself", getpid()); + pr_err("Continue after SIGSTOP.. Urr what?\n"); _exit(1); } @@ -243,7 +249,10 @@ int kdat_x86_has_ptrace_fpu_xsave_bug(void) ret = !xsave.i387.mxcsr; out_kill: - kill(child, SIGKILL); - waitpid(child, &stat, 0); + if (kill(child, SIGKILL)) + pr_perror("Failed to kill my own child"); + if (waitpid(child, &stat, 0) < 0) + pr_perror("Failed wait for a dead child"); + return ret; }