@@ -, +, @@ --- locale/programs/locarchive.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) --- a/locale/programs/locarchive.c +++ a/locale/programs/locarchive.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include "../../crypt/md5.h" @@ -85,11 +86,14 @@ prepare_address_space (int fd, size_t total, size_t *reserved, int *xflags) { void *p = mmap64 (NULL, RESERVE_MMAP_SIZE, PROT_NONE, MAP_SHARED, fd, 0); if (p != MAP_FAILED) - { - *reserved = RESERVE_MMAP_SIZE; - *xflags = MAP_FIXED; - return p; - } + { + /* Some arches require fixed mappings to be aligned higher than + pagesize, and SHMLBA represents that size. */ + size_t align_adjust = (uintptr_t)p & SHMLBA; + *reserved = RESERVE_MMAP_SIZE - align_adjust; + *xflags = MAP_FIXED; + return p + align_adjust; + } } *reserved = total; @@ -271,8 +275,7 @@ file_data_available_p (struct locarhandle *ah, uint32_t offset, uint32_t size) if (st.st_size > ah->reserved) return false; - const size_t pagesz = getpagesize (); - size_t start = ah->mmaped & ~(pagesz - 1); + size_t start = ah->mmaped & ~(SHMLBA - 1); void *p = mmap64 (ah->addr + start, st.st_size - start, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, ah->fd, start); --