Re: SPARC issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jan 19, 2016 at 2:18 PM, David Miller <davem@xxxxxxxxxxxxx> wrote:
> From: Andy Lutomirski <luto@xxxxxxxxxxxxxx>
> Date: Tue, 19 Jan 2016 14:14:43 -0800
>
>> On Tue, Jan 19, 2016 at 1:55 PM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote:
>>> On Tue, Jan 19, 2016 at 01:47:24PM -0800, Andy Lutomirski wrote:
>>>> Essentially all users of is_compat_task in the kernel are trying to
>>>> determine whether they are executing in the context of a compat
>>>> syscall.  On at least x86_64 and sparc, these are not at all the
>>>> same question.
>>>>
>>>> On x86_64 and sparc, therefore, is_compat_task doesn't return the
>>>> overall compat state of the task; it returns true if the task is
>>>> currently in a compat syscall.
>>>
>>> The hell it does.  Andy, TIF_32BIT is *NOT* set on syscall entry; it is
>>> set by execve().  And 64bit task (with that bit clear) can bloody well
>>> issue 32bit syscalls.  Really.
>>
>> It does on x86.  It does not on sparc.  But syscall_get_arch on sparc
>> *also* doesn't appear to work right.
>>
>> davem, how can I check the current syscall bitness on sparc?  It's not
>> obvious to me that it's possible.
>
> You have to do it by context if it's important.
>

What does "by context" mean?  This is definitely important for seccomp
and audit, and I think it's probably important for other users, too.

> In addition to the example Al gave, 32-bit processes can make 64-bit
> syscalls too.  GDB and other ptrace() using applications can use this
> to trace 64-bit programs from 32-bit tracer apps.

On x86, is_compat_task returns true in 32-bit syscalls and false in
64-bit syscalls.  So a 64-bit task that calls a 32-bit syscall gets
is_compat_task.

I think that the naming makes no sense whatsoever but that the
behavior is actually desirable.  If I'm a 32-bit task and I call
64-bit ptrace() [1], I think I want to see the 64-bit siginfo format,
not the 32-bit format.  A bunch of the drivers that use is_compat_task
are specifically trying to distinguish compat from non-compat ioctls.
The SPARC is_compat_task implementation doesn't do that.

I'm trying to phase out is_compat_task entirely from non-arch code.
The WIP version is here:

https://git.kernel.org/cgit/linux/kernel/git/luto/linux.git/log/?h=in_compat_syscall

but it has issues on SPARC.

--Andy
--
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Newbies]     [x86 Platform Driver]     [Netdev]     [Linux Wireless]     [Netfilter]     [Bugtraq]     [Linux Filesystems]     [Yosemite Discussion]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]

  Powered by Linux