diff --git a/init/security.cpp b/init/security.cpp index 0c73faedc..3e1544750 100644 --- a/init/security.cpp +++ b/init/security.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -121,8 +122,12 @@ Result SetMmapRndBitsAction(const BuiltinArguments&) { } #elif defined(__x86_64__) // x86_64 supports 28 - 32 rnd bits, but Android wants to ensure that the - // theoretical maximum of 32 bits is always supported and used. - if (SetMmapRndBitsMin(32, 32, false) && (!Has32BitAbi() || SetMmapRndBitsMin(16, 16, true))) { + // theoretical maximum of 32 bits is always supported and used; except in + // the case of the x86 page size emulator which supports a maximum + // of 30 bits for 16k page size, or 28 bits for 64k page size. + int max_bits = 32 - (static_cast(log2(getpagesize())) - 12); + if (SetMmapRndBitsMin(max_bits, max_bits, false) && + (!Has32BitAbi() || SetMmapRndBitsMin(16, 16, true))) { return {}; } #elif defined(__arm__) || defined(__i386__)