diff --git a/linux-user/mmap.c b/linux-user/mmap.c index d5f22b82b76f73481574ad668e55718c1af0bbfe..2d0c684f4c3fb86e5536c7a28501cc466433efa4 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -382,6 +382,16 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot, end = start + len; real_end = HOST_PAGE_ALIGN(end); + /* + * Test if requested memory area fits target address space + * It can fail only on 64-bit host with 32-bit target. + * On any other target/host host mmap() handles this error correctly. + */ + if ((unsigned long)start + len - 1 > (abi_ulong) -1) { + errno = EINVAL; + goto fail; + } + for(addr = real_start; addr < real_end; addr += TARGET_PAGE_SIZE) { flg = page_get_flags(addr); if (flg & PAGE_RESERVED) {