• Oleg Nesterov's avatar
    ptrace, x86: fix the usage of ptrace_fork() · 06eb23b1
    Oleg Nesterov authored
    I noticed by pure accident we have ptrace_fork() and friends. This was
    added by "x86, bts: add fork and exit handling", commit
    bf53de90.
    
    I can't test this, ds_request_bts() returns -EOPNOTSUPP, but I strongly
    believe this needs the fix. I think something like this program
    
    	int main(void)
    	{
    		int pid = fork();
    
    		if (!pid) {
    			ptrace(PTRACE_TRACEME, 0, NULL, NULL);
    			kill(getpid(), SIGSTOP);
    			fork();
    		} else {
    			struct ptrace_bts_config bts = {
    				.flags = PTRACE_BTS_O_ALLOC,
    				.size  = 4 * 4096,
    			};
    
    			wait(NULL);
    
    			ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK);
    			ptrace(PTRACE_BTS_CONFIG, pid, &bts, sizeof(bts));
    			ptrace(PTRACE_CONT, pid, NULL, NULL);
    
    			sleep(1);
    		}
    
    		return 0;
    	}
    
    should crash the kernel.
    
    If the task is traced by its natural parent ptrace_reparented() returns 0
    but we should clear ->btsxxx anyway.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarMarkus Metzger <markus.t.metzger@intel.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    06eb23b1
fork.c 41.3 KB