summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common/mmap64.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/common/mmap64.c')
-rw-r--r--libc/sysdeps/linux/common/mmap64.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/libc/sysdeps/linux/common/mmap64.c b/libc/sysdeps/linux/common/mmap64.c
index 4ef039710..3c97c846a 100644
--- a/libc/sysdeps/linux/common/mmap64.c
+++ b/libc/sysdeps/linux/common/mmap64.c
@@ -59,13 +59,14 @@ __ptr_t mmap64(__ptr_t addr, size_t len, int prot, int flags, int fd, __off64_t
return MAP_FAILED;
}
-# ifdef __USE_FILE_OFFSET64
- return __syscall_mmap2(addr, len, prot, flags,
- fd, ((__u_quad_t) offset >> MMAP2_PAGE_SHIFT));
-# else
- return __syscall_mmap2(addr, len, prot, flags,
- fd, ((__u_long) offset >> MMAP2_PAGE_SHIFT));
-# endif
+ /*
+ * We know __off64_t is always a signed 64-bit type, but need things
+ * to be unsigned before doing the shift. If it isn't, we might
+ * sign extend things and pass in the wrong value. So cast it to
+ * an unsigned 64-bit value before doing the shift.
+ */
+ return __syscall_mmap2(addr, len, prot, flags, fd,
+ ((uint64_t)offset >> MMAP2_PAGE_SHIFT));
}
# endif