@@ -1664,6 +1664,50 @@ static int validate_section_offset(const struct load_info *info, Elf_Shdr *shdr)
1664
1664
return 0 ;
1665
1665
}
1666
1666
1667
+ /**
1668
+ * elf_validity_ehdr() - Checks an ELF header for module validity
1669
+ * @info: Load info containing the ELF header to check
1670
+ *
1671
+ * Checks whether an ELF header could belong to a valid module. Checks:
1672
+ *
1673
+ * * ELF header is within the data the user provided
1674
+ * * ELF magic is present
1675
+ * * It is relocatable (not final linked, not core file, etc.)
1676
+ * * The header's machine type matches what the architecture expects.
1677
+ * * Optional arch-specific hook for other properties
1678
+ * - module_elf_check_arch() is currently only used by PPC to check
1679
+ * ELF ABI version, but may be used by others in the future.
1680
+ *
1681
+ * Return: %0 if valid, %-ENOEXEC on failure.
1682
+ */
1683
+ static int elf_validity_ehdr (const struct load_info * info )
1684
+ {
1685
+ if (info -> len < sizeof (* (info -> hdr ))) {
1686
+ pr_err ("Invalid ELF header len %lu\n" , info -> len );
1687
+ return - ENOEXEC ;
1688
+ }
1689
+ if (memcmp (info -> hdr -> e_ident , ELFMAG , SELFMAG ) != 0 ) {
1690
+ pr_err ("Invalid ELF header magic: != %s\n" , ELFMAG );
1691
+ return - ENOEXEC ;
1692
+ }
1693
+ if (info -> hdr -> e_type != ET_REL ) {
1694
+ pr_err ("Invalid ELF header type: %u != %u\n" ,
1695
+ info -> hdr -> e_type , ET_REL );
1696
+ return - ENOEXEC ;
1697
+ }
1698
+ if (!elf_check_arch (info -> hdr )) {
1699
+ pr_err ("Invalid architecture in ELF header: %u\n" ,
1700
+ info -> hdr -> e_machine );
1701
+ return - ENOEXEC ;
1702
+ }
1703
+ if (!module_elf_check_arch (info -> hdr )) {
1704
+ pr_err ("Invalid module architecture in ELF header: %u\n" ,
1705
+ info -> hdr -> e_machine );
1706
+ return - ENOEXEC ;
1707
+ }
1708
+ return 0 ;
1709
+ }
1710
+
1667
1711
/*
1668
1712
* Check userspace passed ELF module against our expectations, and cache
1669
1713
* useful variables for further processing as we go.
@@ -1693,30 +1737,10 @@ static int elf_validity_cache_copy(struct load_info *info, int flags)
1693
1737
unsigned int num_info_secs = 0 , info_idx ;
1694
1738
unsigned int num_sym_secs = 0 , sym_idx ;
1695
1739
1696
- if (info -> len < sizeof (* (info -> hdr ))) {
1697
- pr_err ("Invalid ELF header len %lu\n" , info -> len );
1698
- goto no_exec ;
1699
- }
1740
+ err = elf_validity_ehdr (info );
1741
+ if (err < 0 )
1742
+ return err ;
1700
1743
1701
- if (memcmp (info -> hdr -> e_ident , ELFMAG , SELFMAG ) != 0 ) {
1702
- pr_err ("Invalid ELF header magic: != %s\n" , ELFMAG );
1703
- goto no_exec ;
1704
- }
1705
- if (info -> hdr -> e_type != ET_REL ) {
1706
- pr_err ("Invalid ELF header type: %u != %u\n" ,
1707
- info -> hdr -> e_type , ET_REL );
1708
- goto no_exec ;
1709
- }
1710
- if (!elf_check_arch (info -> hdr )) {
1711
- pr_err ("Invalid architecture in ELF header: %u\n" ,
1712
- info -> hdr -> e_machine );
1713
- goto no_exec ;
1714
- }
1715
- if (!module_elf_check_arch (info -> hdr )) {
1716
- pr_err ("Invalid module architecture in ELF header: %u\n" ,
1717
- info -> hdr -> e_machine );
1718
- goto no_exec ;
1719
- }
1720
1744
if (info -> hdr -> e_shentsize != sizeof (Elf_Shdr )) {
1721
1745
pr_err ("Invalid ELF section header size\n" );
1722
1746
goto no_exec ;
0 commit comments