forked from bminor/glibc
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
posix: Fix large mmap64 offset for mips64n32 (BZ#24699)
The fix for BZ#21270 (commit 158d5fa) added a mask to avoid offset larger than 1^44 to be used along __NR_mmap2. However mips64n32 users __NR_mmap, as mips64n64, but still defines off_t as old non-LFS type (other ILP32, such x32, defines off_t being equal to off64_t). This leads to use the same mask meant only for __NR_mmap2 call for __NR_mmap, thus limiting the maximum offset it can use with mmap64. This patch fixes by setting the high mask only for __NR_mmap2 usage. The posix/tst-mmap-offset.c already tests it and also fails for mips64n32. The patch also change the test to check for an arch-specific header that defines the maximum supported offset. Checked on x86_64-linux-gnu, i686-linux-gnu, and I also tests tst-mmap-offset on qemu simulated mips64 with kernel 3.2.0 kernel for both mips-linux-gnu and mips64-n32-linux-gnu. [BZ #24699] * posix/tst-mmap-offset.c: Mention BZ #24699. (do_test_bz21270): Rename to do_test_large_offset and use mmap64_maximum_offset to check for maximum expected offset value. * sysdeps/generic/mmap_info.h: New file. * sysdeps/unix/sysv/linux/mips/mmap_info.h: Likewise. * sysdeps/unix/sysv/linux/mmap64.c (MMAP_OFF_HIGH_MASK): Define iff __NR_mmap2 is used.
- Loading branch information
Showing
5 changed files
with
53 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,14 @@ | ||
2019-07-10 Adhemerval Zanella <[email protected]> | ||
|
||
[BZ #24699] | ||
* posix/tst-mmap-offset.c: Mention BZ #24699. | ||
(do_test_bz21270): Rename to do_test_large_offset and use | ||
mmap64_maximum_offset to check for maximum expected offset value. | ||
* sysdeps/generic/mmap_info.h: New file. | ||
* sysdeps/unix/sysv/linux/mips/mmap_info.h: Likewise. | ||
* sysdeps/unix/sysv/linux/mmap64.c (MMAP_OFF_HIGH_MASK): Define iff | ||
__NR_mmap2 is used. | ||
|
||
2019-07-10 DJ Delorie <[email protected]> | ||
Sergei Trofimovich <[email protected]> | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
/* As default architectures with sizeof (off_t) < sizeof (off64_t) the mmap is | ||
implemented with __SYS_mmap2 syscall and the offset is represented in | ||
multiples of page size. For offset larger than | ||
'1 << (page_shift + 8 * sizeof (off_t))' (that is, 1<<44 on system with | ||
page size of 4096 bytes) the system call silently truncates the offset. | ||
For this case, glibc mmap implementation returns EINVAL. */ | ||
|
||
/* Return the maximum value expected as offset argument in mmap64 call. */ | ||
static inline uint64_t | ||
mmap64_maximum_offset (long int page_shift) | ||
{ | ||
if (sizeof (off_t) < sizeof (off64_t)) | ||
return (UINT64_C(1) << (page_shift + (8 * sizeof (off_t)))) - 1; | ||
else | ||
return UINT64_MAX; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
/* mips64n32 uses __NR_mmap for mmap64 while still having sizeof (off_t) | ||
smaller than sizeof (off64_t). So it allows mapping large offsets | ||
using mmap64 than 32-bit archs which uses __NR_mmap2. */ | ||
|
||
static inline uint64_t | ||
mmap64_maximum_offset (long int page_shift) | ||
{ | ||
#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64 | ||
return UINT64_MAX; | ||
#else | ||
return (UINT64_C(1) << (page_shift + (8 * sizeof (off_t)))) - 1; | ||
#endif | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters