Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fs/binfmt_elf.c: extract elf_read() function

ELF reads done by the kernel have very complicated error detection code
which better live in one place.

Link: http://lkml.kernel.org/r/20191005165215.GB26927@avx2
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Alexey Dobriyan and committed by
Linus Torvalds
658c0335 81696d5d

+24 -25
+24 -25
fs/binfmt_elf.c
··· 404 404 ELF_PAGESTART(cmds[first_idx].p_vaddr); 405 405 } 406 406 407 + static int elf_read(struct file *file, void *buf, size_t len, loff_t pos) 408 + { 409 + ssize_t rv; 410 + 411 + rv = kernel_read(file, buf, len, &pos); 412 + if (unlikely(rv != len)) { 413 + return (rv < 0) ? rv : -EIO; 414 + } 415 + return 0; 416 + } 417 + 407 418 /** 408 419 * load_elf_phdrs() - load ELF program headers 409 420 * @elf_ex: ELF header of the binary whose program headers should be loaded ··· 429 418 { 430 419 struct elf_phdr *elf_phdata = NULL; 431 420 int retval, err = -1; 432 - loff_t pos = elf_ex->e_phoff; 433 421 unsigned int size; 434 422 435 423 /* ··· 449 439 goto out; 450 440 451 441 /* Read in the program headers */ 452 - retval = kernel_read(elf_file, elf_phdata, size, &pos); 453 - if (retval != size) { 454 - err = (retval < 0) ? retval : -EIO; 442 + retval = elf_read(elf_file, elf_phdata, size, elf_ex->e_phoff); 443 + if (retval < 0) { 444 + err = retval; 455 445 goto out; 456 446 } 457 447 ··· 730 720 elf_ppnt = elf_phdata; 731 721 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { 732 722 char *elf_interpreter; 733 - loff_t pos; 734 723 735 724 if (elf_ppnt->p_type != PT_INTERP) 736 725 continue; ··· 747 738 if (!elf_interpreter) 748 739 goto out_free_ph; 749 740 750 - pos = elf_ppnt->p_offset; 751 - retval = kernel_read(bprm->file, elf_interpreter, 752 - elf_ppnt->p_filesz, &pos); 753 - if (retval != elf_ppnt->p_filesz) { 754 - if (retval >= 0) 755 - retval = -EIO; 741 + retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz, 742 + elf_ppnt->p_offset); 743 + if (retval < 0) 756 744 goto out_free_interp; 757 - } 758 745 /* make sure path is NULL terminated */ 759 746 retval = -ENOEXEC; 760 747 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0') ··· 769 764 would_dump(bprm, interpreter); 770 765 771 766 /* Get the exec headers */ 772 - pos = 0; 773 - retval = kernel_read(interpreter, &loc->interp_elf_ex, 774 - sizeof(loc->interp_elf_ex), &pos); 775 - if (retval != sizeof(loc->interp_elf_ex)) { 776 - if (retval >= 0) 777 - retval = -EIO; 767 + retval = elf_read(interpreter, &loc->interp_elf_ex, 768 + sizeof(loc->interp_elf_ex), 0); 769 + if (retval < 0) 778 770 goto out_free_dentry; 779 - } 780 771 781 772 break; 782 773 ··· 1175 1174 unsigned long elf_bss, bss, len; 1176 1175 int retval, error, i, j; 1177 1176 struct elfhdr elf_ex; 1178 - loff_t pos = 0; 1179 1177 1180 1178 error = -ENOEXEC; 1181 - retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos); 1182 - if (retval != sizeof(elf_ex)) 1179 + retval = elf_read(file, &elf_ex, sizeof(elf_ex), 0); 1180 + if (retval < 0) 1183 1181 goto out; 1184 1182 1185 1183 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0) ··· 1203 1203 1204 1204 eppnt = elf_phdata; 1205 1205 error = -ENOEXEC; 1206 - pos = elf_ex.e_phoff; 1207 - retval = kernel_read(file, eppnt, j, &pos); 1208 - if (retval != j) 1206 + retval = elf_read(file, eppnt, j, elf_ex.e_phoff); 1207 + if (retval < 0) 1209 1208 goto out_free_ph; 1210 1209 1211 1210 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)