aboutsummaryrefslogtreecommitdiffstats
path: root/src/3rdparty
diff options
context:
space:
mode:
authorAntonio Napolitano <anton@polit.no>2023-12-30 19:11:32 +0100
committerAntonio Napolitano <anton@polit.no>2024-01-30 11:06:03 +0100
commit524d260c5c135d193e06350e48357444ddb13ddb (patch)
treed867a9b06d0ba64c61c4d0dfd5dbc00bae534edc /src/3rdparty
parent5d79b207c7a47ac96a32c9aff3527e052364b209 (diff)
masm: Don't crash on failed MADV_DONTNEED on Linux
The application could call mlockall(MCL_CURRENT|MCL_FUTURE) to lock all its memory for performance reasons, causing the madvise call to fail. There's no need to crash. Instead, manually zero-out the memory when decommitting. Fixes: QTBUG-120450 Pick-to: 5.15 6.2 6.5 6.6 6.7 Change-Id: I6f1a8968853cc5e61561371bd2a435a686eaf0e4 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/3rdparty')
-rw-r--r--src/3rdparty/masm/wtf/OSAllocatorPosix.cpp11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp b/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp
index a8990a92b4..e183d434bd 100644
--- a/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp
+++ b/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp
@@ -114,10 +114,7 @@ void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable,
if (result == MAP_FAILED)
CRASH();
- while (madvise(result, bytes, MADV_DONTNEED)) {
- if (errno != EAGAIN)
- CRASH();
- }
+ while (madvise(result, bytes, MADV_DONTNEED) == -1 && errno == EAGAIN) { }
if (fd != -1)
close(fd);
@@ -250,8 +247,10 @@ void OSAllocator::decommit(void* address, size_t bytes)
mmap(address, bytes, PROT_NONE, MAP_FIXED | MAP_LAZY | MAP_PRIVATE | MAP_ANON, -1, 0);
#elif OS(LINUX)
while (madvise(address, bytes, MADV_DONTNEED)) {
- if (errno != EAGAIN)
- CRASH();
+ if (errno != EAGAIN) {
+ memset(address, 0, bytes); // We rely on madvise to zero-out the memory
+ break;
+ }
}
if (mprotect(address, bytes, PROT_NONE))
CRASH();