| 80 | |
| 81 | return file_header; |
| 82 | } |
| 83 | |
| 84 | static BAN::ErrorOr<BAN::Vector<ElfW(Phdr)>> read_program_headers(BAN::RefPtr<Inode> inode, const ElfW(Ehdr)& file_header) |
| 85 | { |
| 86 | BAN::Vector<uint8_t> program_header_buffer; |
| 87 | TRY(program_header_buffer.resize(file_header.e_phnum * file_header.e_phentsize)); |
| 88 | TRY(inode->read(file_header.e_phoff, BAN::ByteSpan(program_header_buffer.span()))); |
| 89 | |
| 90 | BAN::Vector<ElfW(Phdr)> program_headers; |
| 91 | TRY(program_headers.reserve(file_header.e_phnum)); |
| 92 | |
| 93 | for (size_t i = 0; i < file_header.e_phnum; i++) |
| 94 | { |
| 95 | const auto& pheader = *reinterpret_cast<ElfW(Phdr)*>(program_header_buffer.data() + i * file_header.e_phentsize); |
| 96 | if (pheader.p_memsz < pheader.p_filesz) |
| 97 | { |
| 98 | dprintln("Invalid program header, memsz less than filesz"); |
| 99 | return BAN::Error::from_errno(EINVAL); |
| 100 | } |
| 101 | |
| 102 | MUST(program_headers.emplace_back(pheader)); |
| 103 | } |
| 104 | |
| 105 | return BAN::move(program_headers); |
| 106 | } |
| 107 |
no test coverage detected