Fix the implementation of mmap based on the mmap2 system call, to construct pgoffset from offset with an unsigned shift rather than a signed (off_t) shift. The mmap2 test in the testsuite catches this case by mmap'ing with a large offset (with the sign bit set). The signed shift repeats the sign bit making the page shift way out of range. This is already fixed similarly in mmap64().
Signed-off-by: James Hogan <[email protected]> --- (resent as it bounced the first time) Is it always correct to cast __off_t to __u_long? I'm a bit unclear whether it's still correct on 64bit architectures or with long file support. libc/sysdeps/linux/common/mmap.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/libc/sysdeps/linux/common/mmap.c b/libc/sysdeps/linux/common/mmap.c index 8995898..d53eabb 100644 --- a/libc/sysdeps/linux/common/mmap.c +++ b/libc/sysdeps/linux/common/mmap.c @@ -63,7 +63,8 @@ __ptr_t mmap(__ptr_t addr, size_t len, int prot, int flags, int fd, __off_t offs __set_errno(EINVAL); return MAP_FAILED; } - return __syscall_mmap2(addr, len, prot, flags, fd, offset >> MMAP2_PAGE_SHIFT); + return __syscall_mmap2(addr, len, prot, flags, + fd, ((__u_long) offset >> MMAP2_PAGE_SHIFT)); } libc_hidden_def(mmap) -- 1.7.7.6 _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
