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 <james.ho...@imgtec.com>
---

(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
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to