• O
    ptrace: PTRACE_DETACH should do flush_ptrace_hw_breakpoint(child) · fab840fc
    Oleg Nesterov 提交于
    Change ptrace_detach() to call flush_ptrace_hw_breakpoint(child).  This
    frees the slots for non-ptrace PERF_TYPE_BREAKPOINT users, and this
    ensures that the tracee won't be killed by SIGTRAP triggered by the
    active breakpoints.
    
    Test-case:
    
    	unsigned long encode_dr7(int drnum, int enable, unsigned int type, unsigned int len)
    	{
    		unsigned long dr7;
    
    		dr7 = ((len | type) & 0xf)
    			<< (DR_CONTROL_SHIFT + drnum * DR_CONTROL_SIZE);
    		if (enable)
    			dr7 |= (DR_GLOBAL_ENABLE << (drnum * DR_ENABLE_SIZE));
    
    		return dr7;
    	}
    
    	int write_dr(int pid, int dr, unsigned long val)
    	{
    		return ptrace(PTRACE_POKEUSER, pid,
    				offsetof (struct user, u_debugreg[dr]),
    				val);
    	}
    
    	void func(void)
    	{
    	}
    
    	int main(void)
    	{
    		int pid, stat;
    		unsigned long dr7;
    
    		pid = fork();
    		if (!pid) {
    			assert(ptrace(PTRACE_TRACEME, 0,0,0) == 0);
    			kill(getpid(), SIGHUP);
    
    			func();
    			return 0x13;
    		}
    
    		assert(pid == waitpid(-1, &stat, 0));
    		assert(WSTOPSIG(stat) == SIGHUP);
    
    		assert(write_dr(pid, 0, (long)func) == 0);
    		dr7 = encode_dr7(0, 1, DR_RW_EXECUTE, DR_LEN_1);
    		assert(write_dr(pid, 7, dr7) == 0);
    
    		assert(ptrace(PTRACE_DETACH, pid, 0,0) == 0);
    		assert(pid == waitpid(-1, &stat, 0));
    		assert(stat == 0x1300);
    
    		return 0;
    	}
    
    Before this patch the child is killed after PTRACE_DETACH.
    Signed-off-by: NOleg Nesterov <oleg@redhat.com>
    Acked-by: NFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
    Cc: Michael Neuling <mikey@neuling.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Paul Mundt <lethal@linux-sh.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Prasad <prasad@linux.vnet.ibm.com>
    Cc: Russell King <linux@arm.linux.org.uk>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    fab840fc
ptrace.c 29.9 KB