summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2012-04-10 00:27:04 -0400
committerMike Frysinger <vapier@gentoo.org>2012-04-10 12:10:01 -0400
commit3d744d6d363329d064fb5ad461054e3e9eff1722 (patch)
treeb0770d444713bb47e70fae7cbe613486c9a8fce8 /libc/sysdeps/linux/common
parent5707bfc85c4da593ae5df6fb243ddb5639957def (diff)
mmap64: always use unsigned 64bit offsets
The current code will sometimes cast the offset to an unsigned long. On 32bit systems, that doesn't make much sense since we always know that the off64_t type is 64bits. So drop the ifdef logic, cast it to an unsigned 64bit value, and then do the shift. If the system is 32bits, and the address is still too large, then there's really nothing we could do about it anyways, so the extra ifdef logic wasn't helping. URL: https://bugs.busybox.net/show_bug.cgi?id=3853 Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'libc/sysdeps/linux/common')
-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