| /* |
| * Copyright (c) 1999-2004 University of New South Wales |
| * |
| * SPDX-License-Identifier: BSD-2-Clause |
| */ |
| |
| #include <elf/elf.h> |
| #include <elf/elf32.h> |
| #include <inttypes.h> |
| #include <string.h> |
| |
| /* ELF header functions */ |
| int elf32_checkFile(elf_t *elf) |
| { |
| if (elf->elfSize < sizeof(Elf32_Ehdr)) { |
| return -1; /* file smaller than ELF header */ |
| } |
| |
| if (elf_check_magic(elf->elfFile) < 0) { |
| return -1; /* not an ELF file */ |
| } |
| |
| Elf32_Ehdr const *header = elf->elfFile; |
| if (header->e_ident[EI_CLASS] != ELFCLASS32) { |
| return -1; /* not a 32-bit ELF */ |
| } |
| |
| if (header->e_phentsize != sizeof(Elf32_Phdr)) { |
| return -1; /* unexpected program header size */ |
| } |
| |
| if (header->e_shentsize != sizeof(Elf32_Shdr)) { |
| return -1; /* unexpected section header size */ |
| } |
| |
| if (header->e_shstrndx >= header->e_shnum) { |
| return -1; /* invalid section header string table section */ |
| } |
| |
| elf->elfClass = header->e_ident[EI_CLASS]; |
| return 0; /* elf header looks OK */ |
| } |
| |
| int elf32_checkProgramHeaderTable(const elf_t *elf) |
| { |
| const Elf32_Ehdr *header = elf->elfFile; |
| size_t ph_end = header->e_phoff + header->e_phentsize * header->e_phnum; |
| if (elf->elfSize < ph_end || ph_end < header->e_phoff) { |
| return -1; /* invalid program header table */ |
| } |
| |
| return 0; |
| } |
| |
| int elf32_checkSectionTable(const elf_t *elf) |
| { |
| const Elf32_Ehdr *header = elf->elfFile; |
| size_t sh_end = header->e_shoff + header->e_shentsize * header->e_shnum; |
| if (elf->elfSize < sh_end || sh_end < header->e_shoff) { |
| return -1; /* invalid section header table */ |
| } |
| |
| return 0; |
| } |