While load_elf_library() is a libc5-ism, we can still replace most of
its contents with elf_load() as well, further simplifying the code.

Cc: Alexander Viro <[email protected]>
Cc: Christian Brauner <[email protected]>
Cc: [email protected]
Cc: [email protected]
Suggested-by: Eric Biederman <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
---
 fs/binfmt_elf.c | 23 ++++-------------------
 1 file changed, 4 insertions(+), 19 deletions(-)

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index db47cb802f89..f8b4747f87ed 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -1351,30 +1351,15 @@ static int load_elf_library(struct file *file)
                eppnt++;
 
        /* Now use mmap to map the library into memory. */
-       error = vm_mmap(file,
-                       ELF_PAGESTART(eppnt->p_vaddr),
-                       (eppnt->p_filesz +
-                        ELF_PAGEOFFSET(eppnt->p_vaddr)),
+       error = elf_load(file, ELF_PAGESTART(eppnt->p_vaddr),
+                       eppnt,
                        PROT_READ | PROT_WRITE | PROT_EXEC,
                        MAP_FIXED_NOREPLACE | MAP_PRIVATE,
-                       (eppnt->p_offset -
-                        ELF_PAGEOFFSET(eppnt->p_vaddr)));
-       if (error != ELF_PAGESTART(eppnt->p_vaddr))
-               goto out_free_ph;
+                       0);
 
-       elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
-       if (padzero(elf_bss)) {
-               error = -EFAULT;
+       if (error != ELF_PAGESTART(eppnt->p_vaddr))
                goto out_free_ph;
-       }
 
-       len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
-       bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
-       if (bss > len) {
-               error = vm_brk(len, bss - len);
-               if (error)
-                       goto out_free_ph;
-       }
        error = 0;
 
 out_free_ph:
-- 
2.34.1


Reply via email to