fs: remove uselib() system call
authorChristian Brauner <brauner@kernel.org>
Tue, 15 Apr 2025 08:27:50 +0000 (10:27 +0200)
committerChristian Brauner <brauner@kernel.org>
Mon, 21 Apr 2025 08:27:59 +0000 (10:27 +0200)
This system call has been deprecated for quite a while now.
Let's try and remove it from the kernel completely.

Link: https://lore.kernel.org/20250415-kanufahren-besten-02ac00e6becd@brauner
Acked-by: Kees Cook <kees@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
arch/m68k/configs/amcore_defconfig
arch/x86/configs/i386_defconfig
arch/xtensa/configs/cadence_csp_defconfig
fs/binfmt_elf.c
fs/exec.c
include/linux/binfmts.h
init/Kconfig
tools/testing/selftests/bpf/config.aarch64
tools/testing/selftests/bpf/config.s390x

index 67a0d157122daa2e81caf25a9c78b1deb0a62586..71ebe444ab71b2cb2427b2c606728ae128dfc064 100644 (file)
@@ -2,7 +2,6 @@ CONFIG_LOCALVERSION="amcore-002"
 CONFIG_DEFAULT_HOSTNAME="amcore"
 CONFIG_SYSVIPC=y
 # CONFIG_FHANDLE is not set
-# CONFIG_USELIB is not set
 CONFIG_LOG_BUF_SHIFT=14
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 # CONFIG_AIO is not set
index 91801138b10bbffa44d6702dbcecdab5275fd034..7cd2f395f301e119e8a8d2b5c210abcbb0857a3d 100644 (file)
@@ -1,7 +1,6 @@
 CONFIG_WERROR=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
-CONFIG_USELIB=y
 CONFIG_AUDIT=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
index 91c4c4cae8a7c4ce7f54dd866d813ef3d399ebd1..49f50d1bd724f3673e14d45b10aaa26bb5094cfb 100644 (file)
@@ -1,6 +1,5 @@
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
-CONFIG_USELIB=y
 CONFIG_NO_HZ_IDLE=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_IRQ_TIME_ACCOUNTING=y
index 584fa89bc8776e3db28e53566996e7ed3aa73e60..7e2afe3220f7af237ca2a388fabfbba329cef6f5 100644 (file)
 
 static int load_elf_binary(struct linux_binprm *bprm);
 
-#ifdef CONFIG_USELIB
-static int load_elf_library(struct file *);
-#else
-#define load_elf_library NULL
-#endif
-
 /*
  * If we don't support core dumping, then supply a NULL so we
  * don't even try.
@@ -101,7 +95,6 @@ static int elf_core_dump(struct coredump_params *cprm);
 static struct linux_binfmt elf_format = {
        .module         = THIS_MODULE,
        .load_binary    = load_elf_binary,
-       .load_shlib     = load_elf_library,
 #ifdef CONFIG_COREDUMP
        .core_dump      = elf_core_dump,
        .min_coredump   = ELF_EXEC_PAGESIZE,
@@ -1361,75 +1354,6 @@ out_free_ph:
        goto out;
 }
 
-#ifdef CONFIG_USELIB
-/* This is really simpleminded and specialized - we are loading an
-   a.out library that is given an ELF header. */
-static int load_elf_library(struct file *file)
-{
-       struct elf_phdr *elf_phdata;
-       struct elf_phdr *eppnt;
-       int retval, error, i, j;
-       struct elfhdr elf_ex;
-
-       error = -ENOEXEC;
-       retval = elf_read(file, &elf_ex, sizeof(elf_ex), 0);
-       if (retval < 0)
-               goto out;
-
-       if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
-               goto out;
-
-       /* First of all, some simple consistency checks */
-       if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
-           !elf_check_arch(&elf_ex) || !file->f_op->mmap)
-               goto out;
-       if (elf_check_fdpic(&elf_ex))
-               goto out;
-
-       /* Now read in all of the header information */
-
-       j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
-       /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
-
-       error = -ENOMEM;
-       elf_phdata = kmalloc(j, GFP_KERNEL);
-       if (!elf_phdata)
-               goto out;
-
-       eppnt = elf_phdata;
-       error = -ENOEXEC;
-       retval = elf_read(file, eppnt, j, elf_ex.e_phoff);
-       if (retval < 0)
-               goto out_free_ph;
-
-       for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
-               if ((eppnt + i)->p_type == PT_LOAD)
-                       j++;
-       if (j != 1)
-               goto out_free_ph;
-
-       while (eppnt->p_type != PT_LOAD)
-               eppnt++;
-
-       /* Now use mmap to map the library into memory. */
-       error = elf_load(file, ELF_PAGESTART(eppnt->p_vaddr),
-                       eppnt,
-                       PROT_READ | PROT_WRITE | PROT_EXEC,
-                       MAP_FIXED_NOREPLACE | MAP_PRIVATE,
-                       0);
-
-       if (error != ELF_PAGESTART(eppnt->p_vaddr))
-               goto out_free_ph;
-
-       error = 0;
-
-out_free_ph:
-       kfree(elf_phdata);
-out:
-       return error;
-}
-#endif /* #ifdef CONFIG_USELIB */
-
 #ifdef CONFIG_ELF_CORE
 /*
  * ELF core dumper
index 8e4ea5f1e64c698f776f252cbf1fdd714cdf45a1..cfbb2b9ee3c9b57f2e7f2524c581574565d0be5c 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -115,66 +115,6 @@ bool path_noexec(const struct path *path)
               (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
 }
 
-#ifdef CONFIG_USELIB
-/*
- * Note that a shared library must be both readable and executable due to
- * security reasons.
- *
- * Also note that we take the address to load from the file itself.
- */
-SYSCALL_DEFINE1(uselib, const char __user *, library)
-{
-       struct linux_binfmt *fmt;
-       struct file *file;
-       struct filename *tmp = getname(library);
-       int error = PTR_ERR(tmp);
-       static const struct open_flags uselib_flags = {
-               .open_flag = O_LARGEFILE | O_RDONLY,
-               .acc_mode = MAY_READ | MAY_EXEC,
-               .intent = LOOKUP_OPEN,
-               .lookup_flags = LOOKUP_FOLLOW,
-       };
-
-       if (IS_ERR(tmp))
-               goto out;
-
-       file = do_filp_open(AT_FDCWD, tmp, &uselib_flags);
-       putname(tmp);
-       error = PTR_ERR(file);
-       if (IS_ERR(file))
-               goto out;
-
-       /*
-        * Check do_open_execat() for an explanation.
-        */
-       error = -EACCES;
-       if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)) ||
-           path_noexec(&file->f_path))
-               goto exit;
-
-       error = -ENOEXEC;
-
-       read_lock(&binfmt_lock);
-       list_for_each_entry(fmt, &formats, lh) {
-               if (!fmt->load_shlib)
-                       continue;
-               if (!try_module_get(fmt->module))
-                       continue;
-               read_unlock(&binfmt_lock);
-               error = fmt->load_shlib(file);
-               read_lock(&binfmt_lock);
-               put_binfmt(fmt);
-               if (error != -ENOEXEC)
-                       break;
-       }
-       read_unlock(&binfmt_lock);
-exit:
-       fput(file);
-out:
-       return error;
-}
-#endif /* #ifdef CONFIG_USELIB */
-
 #ifdef CONFIG_MMU
 /*
  * The nascent bprm->mm is not visible until exec_mmap() but it can
index 1625c8529e70018ba08464c43bc2bc2a1f498d8d..65abd5ab8836cc283a9ffcf4c218a2e74c5b5f93 100644 (file)
@@ -90,7 +90,6 @@ struct linux_binfmt {
        struct list_head lh;
        struct module *module;
        int (*load_binary)(struct linux_binprm *);
-       int (*load_shlib)(struct file *);
 #ifdef CONFIG_COREDUMP
        int (*core_dump)(struct coredump_params *cprm);
        unsigned long min_coredump;     /* minimal dump size */
index dd2ea3b9a799205daa4c1f0c694a9027e344c690..0940fbf024f00f2d4af964197dd81bcf56064944 100644 (file)
@@ -479,16 +479,6 @@ config CROSS_MEMORY_ATTACH
          to directly read from or write to another process' address space.
          See the man page for more details.
 
-config USELIB
-       bool "uselib syscall (for libc5 and earlier)"
-       default ALPHA || M68K || SPARC
-       help
-         This option enables the uselib syscall, a system call used in the
-         dynamic linker from libc5 and earlier.  glibc does not use this
-         system call.  If you intend to run programs built on libc5 or
-         earlier, you may need to enable this syscall.  Current systems
-         running glibc can safely disable this.
-
 config AUDIT
        bool "Auditing support"
        depends on NET
index 3720b7611523b3cdfa1a7c4a7de5ca63311ebe67..e1495a4bbc99cacd2402550a71faeaef89c760ae 100644 (file)
@@ -158,7 +158,6 @@ CONFIG_TRANSPARENT_HUGEPAGE=y
 CONFIG_TUN=y
 CONFIG_UNIX=y
 CONFIG_UPROBES=y
-CONFIG_USELIB=y
 CONFIG_USER_NS=y
 CONFIG_VETH=y
 CONFIG_VLAN_8021Q=y
index 706931a8c2c69d0f70c8678614ea7dee17a8044a..26c3bc2ce11d5e12afb10ff91a214a72293bb5ab 100644 (file)
@@ -128,7 +128,6 @@ CONFIG_TRANSPARENT_HUGEPAGE=y
 CONFIG_TUN=y
 CONFIG_UNIX=y
 CONFIG_UPROBES=y
-CONFIG_USELIB=y
 CONFIG_USER_NS=y
 CONFIG_VETH=y
 CONFIG_VLAN_8021Q=y