• Vitaly Mayatskikh's avatar
    do_wait: fix sys_waitid()-specific behaviour · dfe16dfa
    Vitaly Mayatskikh authored
    do_wait() checks ->wo_info to figure out who is the caller.  If it's not
    NULL the caller should be sys_waitid(), in that case do_wait() fixes up
    the retval or zeros ->wo_info, depending on retval from underlying
    function.
    
    This is bug: user can pass ->wo_info == NULL and sys_waitid() will return
    incorrect value.
    
    man 2 waitid says:
    
    	waitid(): returns 0 on success
    
    Test-case:
    
    	int main(void)
    	{
    		if (fork())
    			assert(waitid(P_ALL, 0, NULL, WEXITED) == 0);
    
    		return 0;
    	}
    
    Result:
    
    	Assertion `waitid(P_ALL, 0, ((void *)0), 4) == 0' failed.
    
    Move that code to sys_waitid().
    
    User-visible change: sys_waitid() will return 0 on success, either
    infop is set or not.
    
    Note, there's another bug in wait_noreap_copyout() which affects
    return value of sys_waitid(). It will be fixed in next patch.
    Signed-off-by: default avatarVitaly Mayatskikh <v.mayatskih@gmail.com>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Roland McGrath <roland@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    dfe16dfa
exit.c 43.4 KB