Index: base/process_util_unittest.cc |
diff --git a/base/process_util_unittest.cc b/base/process_util_unittest.cc |
index d65b5e0e1ba4e4db5ef81b097c12e43bc461c699..771a587633295f1c045f44e2532c4fda3283441b 100644 |
--- a/base/process_util_unittest.cc |
+++ b/base/process_util_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <limits> |
#include "base/command_line.h" |
+#include "base/debug/alias.h" |
#include "base/eintr_wrapper.h" |
#include "base/file_path.h" |
#include "base/logging.h" |
@@ -22,12 +23,12 @@ |
#include "testing/multiprocess_func_list.h" |
#if defined(OS_LINUX) |
-#include <errno.h> |
#include <malloc.h> |
#include <glib.h> |
#include <sched.h> |
#endif |
#if defined(OS_POSIX) |
+#include <errno.h> |
#include <dlfcn.h> |
#include <fcntl.h> |
#include <signal.h> |
@@ -39,6 +40,7 @@ |
#include <windows.h> |
#endif |
#if defined(OS_MACOSX) |
+#include <mach/vm_param.h> |
#include <malloc/malloc.h> |
#include "base/process_util_unittest_mac.h" |
#endif |
@@ -449,11 +451,27 @@ TEST_F(ProcessUtilTest, LaunchAsUser) { |
#if defined(OS_MACOSX) |
-TEST_F(ProcessUtilTest, MacTerminateOnHeapCorruption) { |
- // Note that base::EnableTerminationOnHeapCorruption() is called as part of |
- // test suite setup and does not need to be done again, else mach_override |
- // will fail. |
+// For the following Mac tests: |
+// Note that base::EnableTerminationOnHeapCorruption() is called as part of |
+// test suite setup and does not need to be done again, else mach_override |
+// will fail. |
+ |
+TEST_F(ProcessUtilTest, MacMallocFailureDoesNotTerminate) { |
+ // Test that ENOMEM doesn't crash. The number of bytes is one less than |
+ // MALLOC_ABSOLUTE_MAX_SIZE, above which the system early-returns NULL and |
+ // does not call through malloc_error_break(). See the comment at |
+ // EnableTerminationOnOutOfMemory() for more information. |
+ void* buf = malloc(std::numeric_limits<size_t>::max() - (2 * PAGE_SIZE) - 1); |
+ // The optimizer can be too efficient in Release mode, so alias the value. |
+ base::debug::Alias(buf); |
+ |
+ EXPECT_FALSE(buf); |
+ EXPECT_EQ(ENOMEM, errno); |
+} |
+ |
+TEST_F(ProcessUtilTest, MacTerminateOnHeapCorruption) { |
+ // Assert that freeing an unallocated pointer will crash the process. |
char buf[3]; |
#ifndef ADDRESS_SANITIZER |
ASSERT_DEATH(free(buf), "being freed.*" |