• Oleg Nesterov's avatar
    wait/ptrace: assume __WALL if the child is traced · 0eea2e24
    Oleg Nesterov authored
    commit bf959931 upstream.
    
    The following program (simplified version of generated by syzkaller)
    
    	#include <pthread.h>
    	#include <unistd.h>
    	#include <sys/ptrace.h>
    	#include <stdio.h>
    	#include <signal.h>
    
    	void *thread_func(void *arg)
    	{
    		ptrace(PTRACE_TRACEME, 0,0,0);
    		return 0;
    	}
    
    	int main(void)
    	{
    		pthread_t thread;
    
    		if (fork())
    			return 0;
    
    		while (getppid() != 1)
    			;
    
    		pthread_create(&thread, NULL, thread_func, NULL);
    		pthread_join(thread, NULL);
    		return 0;
    	}
    
    creates an unreapable zombie if /sbin/init doesn't use __WALL.
    
    This is not a kernel bug, at least in a sense that everything works as
    expected: debugger should reap a traced sub-thread before it can reap the
    leader, but without __WALL/__WCLONE do_wait() ignores sub-threads.
    
    Unfortunately, it seems that /sbin/init in most (all?) distributions
    doesn't use it and we have to change the kernel to avoid the problem.
    Note also that most init's use sys_w...
    0eea2e24
exit.c 41.7 KB