diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-02 15:26:05 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-02 15:26:05 +0200 |
commit | 16bdfa2781a3d8ad8626a74c4d3b15be28406a4e (patch) | |
tree | 7a13d4374c3ce6368ac8784d0e9ae5cade5588f7 /src/lib | |
parent | 657d5c803e88d5ae99ace5be92992671e5cdddb5 (diff) |
process: Handle ELF filesz and memsz mismatches by using the smaller value
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/process.zig | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/lib/process.zig b/src/lib/process.zig index 13f7b06..cc0f7d2 100644 --- a/src/lib/process.zig +++ b/src/lib/process.zig @@ -179,10 +179,10 @@ pub fn create(allocator: std.mem.Allocator, elf_buf: []align(@alignOf(elf.Elf64_ while (try it.next()) |phdr| { if (phdr.p_type != elf.PT_LOAD) continue; if (phdr.p_filesz == 0 or phdr.p_memsz == 0) continue; - if (phdr.p_filesz != phdr.p_memsz) return ExeError.SizeMismatch; if (phdr.p_filesz > elf_buf.len or phdr.p_memsz > pages.len) return ExeError.MemOverrun; - @memcpy(pages[phdr.p_offset .. phdr.p_offset + phdr.p_memsz], elf_buf[phdr.p_offset .. phdr.p_offset + phdr.p_filesz]); + const sz = @min(phdr.p_filesz, phdr.p_memsz); + @memcpy(pages[phdr.p_offset .. phdr.p_offset + sz], elf_buf[phdr.p_offset .. phdr.p_offset + sz]); const memsz_aligned = std.mem.alignForwardLog2(phdr.p_memsz, paging.log2_page_size); const num_mappings = @divExact(memsz_aligned, paging.page_size); |