Chromium Code Reviews| Index: base/process_util_unittest.cc |
| diff --git a/base/process_util_unittest.cc b/base/process_util_unittest.cc |
| index d65b5e0e1ba4e4db5ef81b097c12e43bc461c699..3b692d5b15ab2ba6a686b794f0da28413b2cea60 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); |
|
Mark Mentovai
2012/03/07 17:54:12
You should have spaces around the * operator.
Robert Sesek
2012/03/07 17:58:16
Per C++ guide, "it's okay to remove spaces around
|
| + // The optimizer can be too efficient in Release mode, so alias the value. |
| + base::debug::Alias(buf); |
| + |
| + EXPECT_FALSE(buf); |
| + EXPECT_EQ(ENOMEM, errno) << "Expected no memory error"; |
|
Mark Mentovai
2012/03/07 17:54:12
Now that I’m reading this again, I think the strin
Robert Sesek
2012/03/07 17:58:16
Yeah, removed string.
|
| +} |
| + |
| +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.*" |