Thread (17 messages) 17 messages, 5 authors, 2018-12-01

Re: [PATCH v2] signal: add procfd_signal() syscall

From: Christian Brauner <christian@brauner.io>
Date: 2018-11-30 22:26:41
Also in: linux-fsdevel, linux-man, lkml

Possibly related (same subject, not in this thread)

On December 1, 2018 11:09:58 AM GMT+13:00, Arnd Bergmann [off-list ref] wrote:
On Fri, Nov 30, 2018 at 5:36 PM Andy Lutomirski [off-list ref]
wrote:
quoted
On Fri, Nov 30, 2018 at 3:41 AM Arnd Bergmann [off-list ref] wrote:
quoted
siginfo_t as it is now still has a number of other downsides, and
Andy in
quoted
quoted
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
quoted
quoted
it as compat_siginfo depending on
in_compat_syscall()/in_x32_syscall()
quoted
quoted
should work correctly, but feels wrong to me, or at least
inconsistent
quoted
quoted
with how we do this elsewhere.
If everyone else is okay with it, I can get on board with three
variants on x86.  What I can't get on board with is *five* variants
on
quoted
x86, which would be:

procfd_signal via int80 / the 32-bit vDSO: the ia32 structure

syscall64 with nr == 335 (presumably): 64-bit
These seem unavoidable
quoted
syscall64 with nr == 548 | 0x40000000: x32

syscall64 with nr == 548: 64-bit entry but in_compat_syscall() ==
true, behavior is arbitrary

syscall64 with nr == 335 | 0x40000000: x32 entry, but
in_compat_syscall() == false, behavior is arbitrary
Am I misreading the code? The way I understand it, setting the
0x40000000 bit means that both in_compat_syscall() and
in_x32_syscall become() true, based on

static inline bool in_x32_syscall(void)
{
#ifdef CONFIG_X86_X32_ABI
       if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
               return true;
#endif
       return false;
}

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?
quoted
This mess isn't really Christian's fault -- it's been there for a
while, but it's awful and I don't think we want to perpetuate it.
I'm not convinced that not assigning an x32 syscall number
improves the situation, it just means that we now have one
syscall that behaves completely differently from all others,
in that the x32 version requires being called through a
SYSCALL_DEFINE() entry point rather than a
COMPAT_SYSCALL_DEFINE() one, 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().

Of course, the nicest option would be to completely remove
x32 so we can stop worrying about it.
One humble point I would like to make is that what I care about most is a sensible way forward without having to redo essential parts of how syscalls work.
I don't want to introduce a sane, small syscall that ends up breaking all over the place because we decided to fix past mistakes that technically have nothing to do with the patch itself.
However, I do sympathize and understand these concerns.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help