Re: [PATCHv3] x86/mm: set x32 syscall bit in SET_PERSONALITY()

From: Dmitry Safonov
Date: Wed Mar 22 2017 - 09:44:21 EST


On 03/22/2017 01:34 AM, Thomas Gleixner wrote:
On Tue, 21 Mar 2017, hpa@xxxxxxxxx wrote:

On March 21, 2017 3:21:13 PM PDT, Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote:
On Tue, 21 Mar 2017, Dmitry Safonov wrote:
v3:
- clear x32 syscall flag during x32 -> x86-64 exec() (thanks, HPA).

For correctness sake, this wants to be cleared in the IA32 path as
well. It's not causing any harm, but ....

I'll amend the patch.

Indeed, thanks!

Since the i386 syscall namespace is totally separate (and different),
should we simply change the system call number to the appropriate
sys_execve number?

That should work as well and would be more intuitive.

Not sure that I got the idea correctly, something like this?
I haven't find any easy way to get compat syscall nr like
__NR_compat_execve, so I defined it there.
I'll resend v4 with the fixup if that's what was expected.

--->8---
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index b03f186369eb..c58ac0bff2f1 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -507,6 +507,8 @@ void set_personality_64bit(void)
current->personality &= ~READ_IMPLIES_EXEC;
}

+#define __NR_ia32_execve 11
+
void set_personality_ia32(bool x32)
{
/* inherit personality from parent */
@@ -537,6 +539,7 @@ void set_personality_ia32(bool x32)
current->mm->context.ia32_compat = TIF_IA32;
current->personality |= force_personality32;
/* Prepare the first "return" to user space */
+ task_pt_regs(current)->orig_ax = __NR_ia32_execve;
current->thread.status |= TS_COMPAT;
}
}