Commit fbc416ff authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Catalin Marinas

arm64: fix building without CONFIG_UID16

As reported by Michal Simek, building an ARM64 kernel with CONFIG_UID16
disabled currently fails because the system call table still needs to
reference the individual function entry points that are provided by
kernel/sys_ni.c in this case, and the declarations are hidden inside
of #ifdef CONFIG_UID16:

arch/arm64/include/asm/unistd32.h:57:8: error: 'sys_lchown16' undeclared here (not in a function)
 __SYSCALL(__NR_lchown, sys_lchown16)

I believe this problem only exists on ARM64, because older architectures
tend to not need declarations when their system call table is built
in assembly code, while newer architectures tend to not need UID16
support. ARM64 only uses these system calls for compatibility with
32-bit ARM binaries.

This changes the CONFIG_UID16 check into CONFIG_HAVE_UID16, which is
set unconditionally on ARM64 with CONFIG_COMPAT, so we see the
declarations whenever we need them, but otherwise the behavior is
unchanged.

Fixes: af1839eb ("Kconfig: clean up the long arch list for the UID16 config option")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarWill Deacon <will.deacon@arm.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 7142392d
...@@ -524,7 +524,7 @@ asmlinkage long sys_chown(const char __user *filename, ...@@ -524,7 +524,7 @@ asmlinkage long sys_chown(const char __user *filename,
asmlinkage long sys_lchown(const char __user *filename, asmlinkage long sys_lchown(const char __user *filename,
uid_t user, gid_t group); uid_t user, gid_t group);
asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group); asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group);
#ifdef CONFIG_UID16 #ifdef CONFIG_HAVE_UID16
asmlinkage long sys_chown16(const char __user *filename, asmlinkage long sys_chown16(const char __user *filename,
old_uid_t user, old_gid_t group); old_uid_t user, old_gid_t group);
asmlinkage long sys_lchown16(const char __user *filename, asmlinkage long sys_lchown16(const char __user *filename,
......
...@@ -35,7 +35,7 @@ typedef __kernel_gid16_t gid16_t; ...@@ -35,7 +35,7 @@ typedef __kernel_gid16_t gid16_t;
typedef unsigned long uintptr_t; typedef unsigned long uintptr_t;
#ifdef CONFIG_UID16 #ifdef CONFIG_HAVE_UID16
/* This is defined by include/asm-{arch}/posix_types.h */ /* This is defined by include/asm-{arch}/posix_types.h */
typedef __kernel_old_uid_t old_uid_t; typedef __kernel_old_uid_t old_uid_t;
typedef __kernel_old_gid_t old_gid_t; typedef __kernel_old_gid_t old_gid_t;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment