diff options
| author | Kostya Kortchinsky <kostyak@google.com> | 2019-11-21 10:57:49 -0800 |
|---|---|---|
| committer | Kostya Kortchinsky <kostyak@google.com> | 2019-11-25 08:38:45 -0800 |
| commit | 15664fe2c48be242b4b38422466246e9592b6670 (patch) | |
| tree | 26e2a6b7efba375c86d91f7e8b8e69d64489240a /compiler-rt/lib/scudo | |
| parent | bec37c3fc766a7b97f8c52c181c325fd47b75259 (diff) | |
| download | bcm5719-llvm-15664fe2c48be242b4b38422466246e9592b6670.tar.gz bcm5719-llvm-15664fe2c48be242b4b38422466246e9592b6670.zip | |
[scudo][standalone] Fix for releaseToOS prior to init
Summary:
cferris@ found an issue where calling `releaseToOS` prior to any other
heap operation would lead to a crash, due to the allocator not being
properly initialized (it was discovered via `mallopt`).
The fix is to call `initThreadMaybe` prior to calling `releaseToOS` for
the Primary.
Add a test that crashes prior to fix.
Reviewers: hctim, cferris, pcc, eugenis
Subscribers: #sanitizers, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D70552
Diffstat (limited to 'compiler-rt/lib/scudo')
| -rw-r--r-- | compiler-rt/lib/scudo/standalone/combined.h | 5 | ||||
| -rw-r--r-- | compiler-rt/lib/scudo/standalone/tests/combined_test.cpp | 15 |
2 files changed, 19 insertions, 1 deletions
diff --git a/compiler-rt/lib/scudo/standalone/combined.h b/compiler-rt/lib/scudo/standalone/combined.h index 0a05857a20d..8560c2d3599 100644 --- a/compiler-rt/lib/scudo/standalone/combined.h +++ b/compiler-rt/lib/scudo/standalone/combined.h @@ -402,7 +402,10 @@ public: Str.output(); } - void releaseToOS() { Primary.releaseToOS(); } + void releaseToOS() { + initThreadMaybe(); + Primary.releaseToOS(); + } // Iterate over all chunks and call a callback for all busy chunks located // within the provided memory range. Said callback must not use this allocator diff --git a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp index d32ea89e0ea..9205467998e 100644 --- a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp +++ b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp @@ -279,3 +279,18 @@ TEST(ScudoCombinedTest, DeathCombined) { EXPECT_DEATH(Allocator->reallocate(P, Size * 2U), ""); EXPECT_DEATH(Allocator->getUsableSize(P), ""); } + +// Ensure that releaseToOS can be called prior to any other allocator +// operation without issue. +TEST(ScudoCombinedTest, ReleaseToOS) { + using AllocatorT = scudo::Allocator<DeathConfig>; + auto Deleter = [](AllocatorT *A) { + A->unmapTestOnly(); + delete A; + }; + std::unique_ptr<AllocatorT, decltype(Deleter)> Allocator(new AllocatorT, + Deleter); + Allocator->reset(); + + Allocator->releaseToOS(); +} |

