diff --git a/base/process/memory.h b/base/process/memory.h index a930be76d2661a..a73fbe1304834e 100644 --- a/base/process/memory.h +++ b/base/process/memory.h @@ -67,6 +67,8 @@ BASE_EXPORT bool AdjustOOMScore(ProcessId process, int score); // This can be useful for huge and/or unpredictable size memory allocations. // Please only use this if you really handle the case when the allocation // fails. Doing otherwise would risk security. +// These functions may still crash on OOM when running under memory tools, +// specifically ASan and other sanitizers. // Return value tells whether the allocation succeeded. If it fails |result| is // set to NULL, otherwise it holds the memory address. BASE_EXPORT WARN_UNUSED_RESULT bool UncheckedMalloc(size_t size, diff --git a/base/process/memory_linux.cc b/base/process/memory_linux.cc index e1d452b67fa8ed..befd832d66734b 100644 --- a/base/process/memory_linux.cc +++ b/base/process/memory_linux.cc @@ -199,8 +199,7 @@ bool AdjustOOMScore(ProcessId process, int score) { } bool UncheckedMalloc(size_t size, void** result) { -#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \ - defined(THREAD_SANITIZER) || defined(LEAK_SANITIZER) || \ +#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) || \ (!defined(LIBC_GLIBC) && !defined(USE_TCMALLOC)) *result = malloc(size); #elif defined(LIBC_GLIBC) && !defined(USE_TCMALLOC) diff --git a/base/process/memory_unittest.cc b/base/process/memory_unittest.cc index f329fdafee3cc7..048c09d38c1ed6 100644 --- a/base/process/memory_unittest.cc +++ b/base/process/memory_unittest.cc @@ -152,13 +152,9 @@ TEST(ProcessMemoryTest, MacTerminateOnHeapCorruption) { // Android doesn't implement set_new_handler, so we can't use the // OutOfMemoryTest cases. // OpenBSD does not support these tests either. -// AddressSanitizer and ThreadSanitizer define the malloc()/free()/etc. -// functions so that they don't crash if the program is out of memory, so the -// OOM tests aren't supposed to work. // TODO(vandebo) make this work on Windows too. #if !defined(OS_ANDROID) && !defined(OS_OPENBSD) && \ - !defined(OS_WIN) && \ - !defined(ADDRESS_SANITIZER) && !defined(THREAD_SANITIZER) + !defined(OS_WIN) #if defined(USE_TCMALLOC) extern "C" { @@ -397,7 +393,9 @@ class OutOfMemoryHandledTest : public OutOfMemoryTest { // TODO(b.kelemen): make UncheckedMalloc and UncheckedCalloc work // on Windows as well. - +// UncheckedMalloc() and UncheckedCalloc() work as regular malloc()/calloc() +// under sanitizer tools. +#if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) TEST_F(OutOfMemoryHandledTest, UncheckedMalloc) { EXPECT_TRUE(base::UncheckedMalloc(kSafeMallocSize, &value_)); EXPECT_TRUE(value_ != NULL); @@ -426,6 +424,5 @@ TEST_F(OutOfMemoryHandledTest, UncheckedCalloc) { EXPECT_FALSE(base::UncheckedCalloc(1, test_size_, &value_)); EXPECT_TRUE(value_ == NULL); } - -#endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && - // !defined(OS_WIN) && !defined(ADDRESS_SANITIZER) +#endif // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) +#endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && !defined(OS_WIN)