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:
parent
3e959618c3
commit
cfb9f889ac
Notes:
sideshowbarker
2024-07-17 20:56:08 +09:00
Author: https://github.com/IdanHo
Commit: cfb9f889ac
Pull-request: https://github.com/SerenityOS/serenity/pull/11871
Reviewed-by: https://github.com/bgianfo
8 changed files with 17 additions and 17 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue