On Sat, Dec 1, 2018 at 12:54 AM Andy Lutomirski <luto@xxxxxxxxxx> wrote: > On Fri, Nov 30, 2018 at 2:10 PM Arnd Bergmann <arnd@xxxxxxxx> wrote: > > On Fri, Nov 30, 2018 at 5:36 PM Andy Lutomirski <luto@xxxxxxxxxx> wrote: > > > On Fri, Nov 30, 2018 at 3:41 AM Arnd Bergmann <arnd@xxxxxxxx> wrote: > > > > siginfo_t as it is now still has a number of other downsides, and Andy in > > > > particular didn't like the idea of having three new variants on x86 > > > > (depending on how you count). His alternative suggestion of having > > > > a single syscall entry point that takes a 'signfo_t __user *' but interprets > > > > it as compat_siginfo depending on in_compat_syscall()/in_x32_syscall() > > > > should work correctly, but feels wrong to me, or at least inconsistent > > > > with how we do this elsewhere. > > The '548 | 0x40000000' part seems to be the only sensible > > way to handle x32 here. What exactly would you propose to > > avoid defining the other entry points? > > I would propose that it should be 335 | 0x40000000. I can't see any > reasonable way to teach the kernel to reject 335 | 0x40000000 that > wouldn't work just as well to accept it and make it do the right > thing. Currently we accept it and do the *wrong* thing, which is no > good. > > > and we have to > > add more complexity to the copy_siginfo_from_user() > > implementation to duplicate the hack that exists in > > copy_siginfo_from_user32(). > > What hack are you referring to here? I mean this part: #ifdef CONFIG_COMPAT int copy_siginfo_to_user32(struct compat_siginfo __user *to, const struct kernel_siginfo *from) #if defined(CONFIG_X86_X32_ABI) || defined(CONFIG_IA32_EMULATION) { return __copy_siginfo_to_user32(to, from, in_x32_syscall()); } int __copy_siginfo_to_user32(struct compat_siginfo __user *to, const struct kernel_siginfo *from, bool x32_ABI) #endif { ... case SIL_CHLD: new.si_pid = from->si_pid; new.si_uid = from->si_uid; new.si_status = from->si_status; #ifdef CONFIG_X86_X32_ABI if (x32_ABI) { new._sifields._sigchld_x32._utime = from->si_utime; new._sifields._sigchld_x32._stime = from->si_stime; } else #endif { new.si_utime = from->si_utime; new.si_stime = from->si_stime; } break; ... } #endif If we have a '548 | 0x40000000' entry pointing to __x32_compat_sys_procfd_kill, then that will do the right thing. If you instead try to have x32 call into the native sys_procfd_kill, then copy_siginfo_to_user() will also have to know about x32, effectively duplicating that mess above, unless you want to also change all users of copy_siginfo_to_user32() to use copy_siginfo_to_user() and handle all cases in one function. Arnd