From a8908c3517cc93249bb6ec2c693cf80874c7f629 Mon Sep 17 00:00:00 2001 From: James Hogan Date: Thu, 17 May 2012 12:42:54 +0100 Subject: mmap()->sys_mmap2: do unsigned shift of offset 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 Signed-off-by: Mike Frysinger --- libc/sysdeps/linux/common/mmap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libc/sysdeps/linux') diff --git a/libc/sysdeps/linux/common/mmap.c b/libc/sysdeps/linux/common/mmap.c index 89958985e..d53eabb18 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) -- cgit v1.2.3