Re: [RESEND PATCH] sys_personality: Add optional arch hook arch_check_personality

From: Wangshaobo (bobo)
Date: Mon Jun 08 2020 - 09:17:10 EST



在 2020/6/8 17:46, Catalin Marinas 写道:
On Mon, Jun 08, 2020 at 10:49:25AM +0800, Wang ShaoBo wrote:
Currently arm64 personality syscall uses wrapper __arm64_sys_personality
to redirect to __arm64_sys_arm64_personality, it's easily confused,
Whereas using an normal hook arch_check_personality() can reject
additional settings like this for special case of different architectures.

This makes code clean and easier for subsequent modification.
Do you plan to add more stuff here? Curious what triggered this patch.

diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c
index d5ffaaab31a7..5c01816d7a77 100644
--- a/arch/arm64/kernel/sys.c
+++ b/arch/arm64/kernel/sys.c
@@ -28,12 +28,13 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
}
-SYSCALL_DEFINE1(arm64_personality, unsigned int, personality)
+int arch_check_personality(unsigned int personality)
{
if (personality(personality) == PER_LINUX32 &&
!system_supports_32bit_el0())
return -EINVAL;
- return ksys_personality(personality);
+
+ return 0;
}
We use the ksys_* pattern in other places as well, so this wouldn't be
something new.

diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 1815065d52f3..3dbbad498027 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -1393,16 +1393,6 @@ static inline long ksys_truncate(const char __user *pathname, loff_t length)
return do_sys_truncate(pathname, length);
}
-static inline unsigned int ksys_personality(unsigned int personality)
-{
- unsigned int old = current->personality;
-
- if (personality != 0xffffffff)
- set_personality(personality);
-
- return old;
-}
-
/* for __ARCH_WANT_SYS_IPC */
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
unsigned int nsops,
diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c
index 33f07c5f2515..f3682f4bf205 100644
--- a/kernel/exec_domain.c
+++ b/kernel/exec_domain.c
@@ -35,9 +35,21 @@ static int __init proc_execdomains_init(void)
module_init(proc_execdomains_init);
#endif
+int __weak arch_check_personality(unsigned int personality)
+{
+ return 0;
+}
+
SYSCALL_DEFINE1(personality, unsigned int, personality)
{
- unsigned int old = current->personality;
+ int err;
+ unsigned int old;
+
+ err = arch_check_personality(personality);
+ if (err)
+ return err;
+
+ old = current->personality;
I'm surprised that the generic sys_personality() doesn't call
ksys_personality() directly but rather duplicates the code.

Anyway, without knowing what else you plan to do with
arch_check_personality(), I don't think it's worth changing. Calling
ksys_personality() directly from sys_personality() would be a good
clean-up though.

Hi catalin,

I have sent a version just calling ksys_personality() directly from sys_personality() before:

https://lore.kernel.org/patchwork/patch/1158872/

thanks,

Wang ShaoBo