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_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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -68,12 +68,6 @@
|
|||
|
||||
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
|
||||
|
|
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);
|
||||
}
|
||||
|
||||
#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
|
||||
|
|
|
@ -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 */
|
||||
|
|
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.
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue