diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-27 19:13:01 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-27 19:13:15 +0200 |
commit | d6c48bef193658542e61990ae6c14851d80b3ea4 (patch) | |
tree | ab585d9b9fdeca5fb419c288729e7c26bdeb554b /src/lib/syscall.zig | |
parent | 08cbf8d538b518bd99a930628801465cedeb4566 (diff) |
syscall: Fail on zero address parameter values
Fixes #63.
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 959a8ad..62176db 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -12,6 +12,7 @@ const trap = @import("trap.zig"); pub const Error = error{ Unimplemented, + ZeroAddressSupplied, }; pub const HandleError = error{ @@ -36,8 +37,8 @@ pub const ErrorNameError = error{ErrorOutOfRange}; // errorName(value: usize, buffer: [*]u8, len: usize) !usize fn errorName(trap_frame: *const trap.Frame) !usize { const value_wide = trap_frame.general_purpose_registers[10]; - // fixme: Kernel panic if null pointer - const buffer_ptr: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]); + const buffer_opt: ?[*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]); + const buffer_ptr = buffer_opt orelse return Error.ZeroAddressSupplied; const len = trap_frame.general_purpose_registers[12]; const value = std.math.cast(u16, value_wide) orelse { @@ -75,8 +76,8 @@ fn uprint(trap_frame: *const trap.Frame) void { fn launch(trap_frame: *const trap.Frame) !usize { const alignment = @alignOf(std.elf.Elf64_Ehdr); const bytes_addr = trap_frame.general_purpose_registers[10]; - // fixme: Kernel panic if null pointer - const bytes_ptr: [*]align(alignment) const u8 = @ptrFromInt(bytes_addr); + const bytes_opt: ?[*]align(alignment) const u8 = @ptrFromInt(bytes_addr); + const bytes_ptr = bytes_opt orelse return Error.ZeroAddressSupplied; const len = trap_frame.general_purpose_registers[11]; const bytes = bytes_ptr[0..len]; |