diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2022-02-25 14:07:54 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2022-03-25 19:39:56 +0100 |
commit | 6aef29a7316d50800fb9cec388139bd3870f682e (patch) | |
tree | 1176698e5d918174393164739d6657555f174fe7 /src/3rdparty/masm/wtf/OSAllocatorPosix.cpp | |
parent | 4540b06c4a5b0820387929990ddc5ef0df006451 (diff) |
QML: Protect against EAGAIN when calling madvise on linux
Apparently it can fail with EAGAIN. We rely on madvise to zero out the
memory. Therefore loop until it succeeds like we do on other OS.
Pick-to: 5.15 6.2 6.3
Fixes: QTBUG-100431
Change-Id: I9819f8d82a251e222b0b500991584d40e641b672
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/3rdparty/masm/wtf/OSAllocatorPosix.cpp')
-rw-r--r-- | src/3rdparty/masm/wtf/OSAllocatorPosix.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp b/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp index f7d8a0b30f..868a101935 100644 --- a/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp +++ b/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp @@ -113,7 +113,11 @@ void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable, (fd == -1 ? MAP_ANON : 0), fd, 0); if (result == MAP_FAILED) CRASH(); - madvise(result, bytes, MADV_DONTNEED); + + while (madvise(result, bytes, MADV_DONTNEED)) { + if (errno != EAGAIN) + CRASH(); + } if (fd != -1) close(fd); @@ -220,7 +224,12 @@ void OSAllocator::commit(void* address, size_t bytes, bool writable, bool execut protection |= PROT_EXEC; if (mprotect(address, bytes, protection)) CRASH(); - madvise(address, bytes, MADV_WILLNEED); + + while (madvise(address, bytes, MADV_WILLNEED)) { + if (errno != EAGAIN) + CRASH(); + } + #elif HAVE(MADV_FREE_REUSE) UNUSED_PARAM(writable); UNUSED_PARAM(executable); @@ -240,7 +249,10 @@ void OSAllocator::decommit(void* address, size_t bytes) // Use PROT_NONE and MAP_LAZY to decommit the pages. mmap(address, bytes, PROT_NONE, MAP_FIXED | MAP_LAZY | MAP_PRIVATE | MAP_ANON, -1, 0); #elif OS(LINUX) - madvise(address, bytes, MADV_DONTNEED); + while (madvise(address, bytes, MADV_DONTNEED)) { + if (errno != EAGAIN) + CRASH(); + } if (mprotect(address, bytes, PROT_NONE)) CRASH(); #elif HAVE(MADV_FREE_REUSE) |