Re: [PATCH 2/6] exec: simplify the compat syscall handling
From: Brian Gerst <hidden>
Date: 2020-06-15 14:48:45
Also in:
linux-arch, linux-fsdevel, linux-mips, linux-s390, linuxppc-dev, lkml, sparclinux
On Mon, Jun 15, 2020 at 10:13 AM Christoph Hellwig [off-list ref] wrote:
On Mon, Jun 15, 2020 at 03:31:35PM +0200, Arnd Bergmann wrote:quoted
quoted
#ifdef CONFIG_COMPAT - if (unlikely(argv.is_compat)) { + if (in_compat_syscall()) { + const compat_uptr_t __user *compat_argv = + compat_ptr((unsigned long)argv); compat_uptr_t compat; - if (get_user(compat, argv.ptr.compat + nr)) + if (get_user(compat, compat_argv + nr)) return ERR_PTR(-EFAULT); return compat_ptr(compat); } #endifI would expect that the "#ifdef CONFIG_COMPAT" can be removed now, since compat_ptr() and in_compat_syscall() are now defined unconditionally. I have not tried that though.True, I'll give it a spin.quoted
quoted
+/* + * x32 syscalls are listed in the same table as x86_64 ones, so we need to + * define compat syscalls that are exactly the same as the native version for + * the syscall table machinery to work. Sigh.. + */ +#ifdef CONFIG_X86_X32 COMPAT_SYSCALL_DEFINE3(execve, const char __user *, filename, - const compat_uptr_t __user *, argv, - const compat_uptr_t __user *, envp) + const char __user *const __user *, argv, + const char __user *const __user *, envp) { - return do_compat_execve(AT_FDCWD, getname(filename), argv, envp, 0); + return do_execveat(AT_FDCWD, getname(filename), argv, envp, 0, NULL); }Maybe move it to arch/x86/kernel/process_64.c or arch/x86/entry/syscall_x32.c to keep it out of the common code if this is needed.I'd rather keep it in common code as that allows all the low-level exec stuff to be marked static, and avoid us growing new pointless compat variants through copy and paste. smart compiler to dquoted
I don't really understand the comment, why can't this just use this?That errors out with: ld: arch/x86/entry/syscall_x32.o:(.rodata+0x1040): undefined reference to `__x32_sys_execve' ld: arch/x86/entry/syscall_x32.o:(.rodata+0x1108): undefined reference to `__x32_sys_execveat' make: *** [Makefile:1139: vmlinux] Error 1
I think I have a fix for this, by modifying the syscall wrappers to add an alias for the __x32 variant to the native __x64_sys_foo(). I'll get back to you with a patch. -- Brian Gerst _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel