aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os/linux.zig
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/os/linux.zig')
-rw-r--r--lib/std/os/linux.zig24
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig
index eb2f71cf99..9550518842 100644
--- a/lib/std/os/linux.zig
+++ b/lib/std/os/linux.zig
@@ -193,9 +193,29 @@ pub fn umount2(special: [*]const u8, flags: u32) usize {
pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: u32, fd: i32, offset: u64) usize {
if (@hasDecl(@This(), "SYS_mmap2")) {
- return syscall6(SYS_mmap2, @ptrToInt(address), length, prot, flags, @bitCast(usize, isize(fd)), @truncate(usize, offset / MMAP2_UNIT));
+ // Make sure the offset is also specified in multiples of page size
+ if ((offset & (MMAP2_UNIT - 1)) != 0)
+ return @bitCast(usize, isize(-EINVAL));
+
+ return syscall6(
+ SYS_mmap2,
+ @ptrToInt(address),
+ length,
+ prot,
+ flags,
+ @bitCast(usize, isize(fd)),
+ @truncate(usize, offset / MMAP2_UNIT),
+ );
} else {
- return syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, @bitCast(usize, isize(fd)), offset);
+ return syscall6(
+ SYS_mmap,
+ @ptrToInt(address),
+ length,
+ prot,
+ flags,
+ @bitCast(usize, isize(fd)),
+ offset,
+ );
}
}