Skip to content
  • Oleg Nesterov's avatar
    ptrace: change tracehook_report_syscall_exit() to handle stepping · 2f0edac5
    Oleg Nesterov authored
    
    
    Suggested by Roland.
    
    Change tracehook_report_syscall_exit() to look at step flag and send the
    trap signal if needed.
    
    This change affects ia64, microblaze, parisc, powerpc, sh.  They pass
    nonzero "step" argument to tracehook but since it was ignored the tracee
    reports via ptrace_notify(), this is not right and not consistent.
    
    	- PTRACE_SETSIGINFO doesn't work
    
    	- if the tracer resumes the tracee with signr != 0 the new signal
    	  is generated rather than delivering it
    
    	- If PT_TRACESYSGOOD is set the tracee reports the wrong exit_code
    
    I don't have a powerpc machine, but I think this test-case should see the
    difference:
    
    	#include <unistd.h>
    	#include <sys/ptrace.h>
    	#include <sys/wait.h>
    	#include <assert.h>
    	#include <stdio.h>
    
    	int main(void)
    	{
    		int pid, status;
    
    		if (!(pid = fork())) {
    			assert(ptrace(PTRACE_TRACEME) == 0);
    			kill(getpid(), SIGSTOP);
    
    			getppid();
    
    			return 0;
    		}
    
    		assert(pid == wait(&status));
    		assert(ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) == 0);
    
    		assert(ptrace(PTRACE_SYSCALL, pid, 0,0) == 0);
    		assert(pid == wait(&status));
    
    		assert(ptrace(PTRACE_SINGLESTEP, pid, 0,0) == 0);
    		assert(pid == wait(&status));
    
    		if (status == 0x57F)
    			return 0;
    
    		printf("kernel bug: status=%X shouldn't have 0x80\n", status);
    		return 1;
    	}
    
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarRoland McGrath <roland@redhat.com>
    Cc: <linux-arch@vger.kernel.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2f0edac5