1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-11 02:13:56 +09:00

LibELF: Accept Span instead of Pointer+Size in validate_program_headers

This commit is contained in:
Idan Horowitz 2022-01-13 20:54:53 +02:00 committed by Andreas Kling
parent 3e959618c3
commit cfb9f889ac
Notes: sideshowbarker 2024-07-17 20:56:08 +09:00
8 changed files with 17 additions and 17 deletions

View file

@ -14,7 +14,7 @@
namespace ELF {
bool validate_elf_header(const ElfW(Ehdr) & elf_header, size_t file_size, bool verbose)
bool validate_elf_header(ElfW(Ehdr) const& elf_header, size_t file_size, bool verbose)
{
if (!IS_ELF(elf_header)) {
if (verbose)
@ -192,7 +192,7 @@ bool validate_elf_header(const ElfW(Ehdr) & elf_header, size_t file_size, bool v
return true;
}
ErrorOr<bool> validate_program_headers(const ElfW(Ehdr) & elf_header, size_t file_size, const u8* buffer, size_t buffer_size, StringBuilder* interpreter_path_builder, bool verbose)
ErrorOr<bool> validate_program_headers(ElfW(Ehdr) const& elf_header, size_t file_size, ReadonlyBytes buffer, StringBuilder* interpreter_path_builder, bool verbose)
{
Checked<size_t> total_size_of_program_headers = elf_header.e_phnum;
total_size_of_program_headers *= elf_header.e_phentsize;
@ -207,19 +207,19 @@ ErrorOr<bool> validate_program_headers(const ElfW(Ehdr) & elf_header, size_t fil
}
// Can we actually parse all the program headers in the given buffer?
if (end_of_last_program_header > buffer_size) {
if (end_of_last_program_header > buffer.size()) {
if (verbose)
dbgln("Unable to parse program headers from buffer, buffer too small! Buffer size: {}, End of program headers {}", buffer_size, end_of_last_program_header.value());
dbgln("Unable to parse program headers from buffer, buffer too small! Buffer size: {}, End of program headers {}", buffer.size(), end_of_last_program_header.value());
return false;
}
if (file_size < buffer_size) {
if (file_size < buffer.size()) {
dbgln("We somehow read more from a file than was in the file in the first place!");
VERIFY_NOT_REACHED();
}
size_t num_program_headers = elf_header.e_phnum;
auto program_header_begin = (const ElfW(Phdr)*)&(buffer[elf_header.e_phoff]);
auto program_header_begin = (const ElfW(Phdr)*)buffer.offset(elf_header.e_phoff);
for (size_t header_index = 0; header_index < num_program_headers; ++header_index) {
auto& program_header = program_header_begin[header_index];
@ -258,7 +258,7 @@ ErrorOr<bool> validate_program_headers(const ElfW(Ehdr) & elf_header, size_t fil
dbgln("Integer overflow while validating PT_INTERP header");
return false;
}
if (program_header.p_offset + program_header.p_filesz > buffer_size) {
if (program_header.p_offset + program_header.p_filesz > buffer.size()) {
if (verbose)
dbgln("Found PT_INTERP header ({}), but the .interp section was not within the buffer :(", header_index);
return false;
@ -269,7 +269,7 @@ ErrorOr<bool> validate_program_headers(const ElfW(Ehdr) & elf_header, size_t fil
return false;
}
if (interpreter_path_builder)
TRY(interpreter_path_builder->try_append({ &buffer[program_header.p_offset], program_header.p_filesz - 1 }));
TRY(interpreter_path_builder->try_append({ buffer.offset(program_header.p_offset), program_header.p_filesz - 1 }));
break;
case PT_LOAD:
case PT_DYNAMIC: