aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-02 15:26:05 +0200
committerHimbeer <himbeer@disroot.org>2024-07-02 15:26:05 +0200
commit16bdfa2781a3d8ad8626a74c4d3b15be28406a4e (patch)
tree7a13d4374c3ce6368ac8784d0e9ae5cade5588f7 /src/lib
parent657d5c803e88d5ae99ace5be92992671e5cdddb5 (diff)
process: Handle ELF filesz and memsz mismatches by using the smaller value
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/process.zig4
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);