mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
fs: remove uselib() system call
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>
This commit is contained in:
parent
d1f482108a
commit
79beea2db0
9 changed files with 0 additions and 152 deletions
|
@ -2,7 +2,6 @@ CONFIG_LOCALVERSION="amcore-002"
|
||||||
CONFIG_DEFAULT_HOSTNAME="amcore"
|
CONFIG_DEFAULT_HOSTNAME="amcore"
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_FHANDLE is not set
|
# CONFIG_FHANDLE is not set
|
||||||
# CONFIG_USELIB is not set
|
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
# CONFIG_AIO is not set
|
# CONFIG_AIO is not set
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_WERROR=y
|
CONFIG_WERROR=y
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_USELIB=y
|
|
||||||
CONFIG_AUDIT=y
|
CONFIG_AUDIT=y
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_USELIB=y
|
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||||
|
|
|
@ -68,12 +68,6 @@
|
||||||
|
|
||||||
static int load_elf_binary(struct linux_binprm *bprm);
|
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
|
* If we don't support core dumping, then supply a NULL so we
|
||||||
* don't even try.
|
* don't even try.
|
||||||
|
@ -101,7 +95,6 @@ static int elf_core_dump(struct coredump_params *cprm);
|
||||||
static struct linux_binfmt elf_format = {
|
static struct linux_binfmt elf_format = {
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.load_binary = load_elf_binary,
|
.load_binary = load_elf_binary,
|
||||||
.load_shlib = load_elf_library,
|
|
||||||
#ifdef CONFIG_COREDUMP
|
#ifdef CONFIG_COREDUMP
|
||||||
.core_dump = elf_core_dump,
|
.core_dump = elf_core_dump,
|
||||||
.min_coredump = ELF_EXEC_PAGESIZE,
|
.min_coredump = ELF_EXEC_PAGESIZE,
|
||||||
|
@ -1361,75 +1354,6 @@ out_free_ph:
|
||||||
goto out;
|
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
|
#ifdef CONFIG_ELF_CORE
|
||||||
/*
|
/*
|
||||||
* ELF core dumper
|
* ELF core dumper
|
||||||
|
|
60
fs/exec.c
60
fs/exec.c
|
@ -115,66 +115,6 @@ bool path_noexec(const struct path *path)
|
||||||
(path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
|
(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
|
#ifdef CONFIG_MMU
|
||||||
/*
|
/*
|
||||||
* The nascent bprm->mm is not visible until exec_mmap() but it can
|
* The nascent bprm->mm is not visible until exec_mmap() but it can
|
||||||
|
|
|
@ -90,7 +90,6 @@ struct linux_binfmt {
|
||||||
struct list_head lh;
|
struct list_head lh;
|
||||||
struct module *module;
|
struct module *module;
|
||||||
int (*load_binary)(struct linux_binprm *);
|
int (*load_binary)(struct linux_binprm *);
|
||||||
int (*load_shlib)(struct file *);
|
|
||||||
#ifdef CONFIG_COREDUMP
|
#ifdef CONFIG_COREDUMP
|
||||||
int (*core_dump)(struct coredump_params *cprm);
|
int (*core_dump)(struct coredump_params *cprm);
|
||||||
unsigned long min_coredump; /* minimal dump size */
|
unsigned long min_coredump; /* minimal dump size */
|
||||||
|
|
10
init/Kconfig
10
init/Kconfig
|
@ -479,16 +479,6 @@ config CROSS_MEMORY_ATTACH
|
||||||
to directly read from or write to another process' address space.
|
to directly read from or write to another process' address space.
|
||||||
See the man page for more details.
|
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
|
config AUDIT
|
||||||
bool "Auditing support"
|
bool "Auditing support"
|
||||||
depends on NET
|
depends on NET
|
||||||
|
|
|
@ -158,7 +158,6 @@ CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||||
CONFIG_TUN=y
|
CONFIG_TUN=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_UPROBES=y
|
CONFIG_UPROBES=y
|
||||||
CONFIG_USELIB=y
|
|
||||||
CONFIG_USER_NS=y
|
CONFIG_USER_NS=y
|
||||||
CONFIG_VETH=y
|
CONFIG_VETH=y
|
||||||
CONFIG_VLAN_8021Q=y
|
CONFIG_VLAN_8021Q=y
|
||||||
|
|
|
@ -128,7 +128,6 @@ CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||||
CONFIG_TUN=y
|
CONFIG_TUN=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_UPROBES=y
|
CONFIG_UPROBES=y
|
||||||
CONFIG_USELIB=y
|
|
||||||
CONFIG_USER_NS=y
|
CONFIG_USER_NS=y
|
||||||
CONFIG_VETH=y
|
CONFIG_VETH=y
|
||||||
CONFIG_VLAN_8021Q=y
|
CONFIG_VLAN_8021Q=y
|
||||||
|
|
Loading…
Add table
Reference in a new issue