Messages in this thread | | | From | Roland McGrath <> | Subject | Re: [PATCH 1/5] Split wait_noreap_copyout() | Date | Wed, 20 May 2009 13:29:50 -0700 (PDT) |
| |
> do_wait() && infop interaction is really strange before the patch.
do_wait() underlies sys_wait4() and sys_waitid(). The original intent was that all the infop==NULL cases are just for the sys_wait4() path. In the sys_waitid() path, infop comes from the user and NULL always ought to have been invalid.
See http://lkml.org/lkml/2009/1/13/446 for the previous thread about this. We wanted to clean it up, but Linus objected to changing the userland behavior of passing NULL to waitid on the grounds of "never regress the ABI, even if it was not supposed to be the ABI".
> When do_wait() is called without WNOWAIT, then infop == NULL is fine. > > If WNOWAIT is set, we return -EFAULT. Except in WCONTINUED case > infop == NULL is fine again.
WNOWAIT can only be set in the sys_waitid() path, not by sys_wait4(). Without WNOWAIT, it might be sys_wait4(), where infop==NULL is normal. The WCONTINUED variance was unintended.
I would be fine with any way you want to clean this up. But presumably Linus would object again if any combination of userland arguments that is now permitted were to start returning an error. I'm guessing he won't object to making the WNOWAIT case consistent with other sys_waitid() calls that pass NULL (i.e. -EFAULT -> success acceptable, but success -> -EFAULT not acceptable).
Thanks, Roland
| |