summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoricoolidge <icoolidge@chromium.org>2015-04-01 00:03:22 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-01 07:04:08 +0000
commit82cb6b003c8e20e4a8386bf8698980bb4981d434 (patch)
tree3e67ec25415c3713b07e1d6154d340ac5f1764f9
parent6119a59cd027dc95156d29c3d922d673e55ad1f5 (diff)
downloadchromium_src-82cb6b003c8e20e4a8386bf8698980bb4981d434.zip
chromium_src-82cb6b003c8e20e4a8386bf8698980bb4981d434.tar.gz
chromium_src-82cb6b003c8e20e4a8386bf8698980bb4981d434.tar.bz2
Fix OutOfMemoryDeathTest.ViaSharedLibraries.
This test was invalid on modern glibc: asprintf errors EOVERFLOW without attempting an allocation when the size is at least INT_MAX - 32. INT_MAX - 33 is the largest size that can attempt to trigger allocation failure, and will not necessarily accomplish that on some systems. Create a library that is specified to wrap malloc trivially, to accomplish the goal of the test without external dependencies or inconsistently implemented behavior. BUG=428211 Review URL: https://codereview.chromium.org/878473002 Cr-Commit-Position: refs/heads/master@{#323197}
-rw-r--r--base/BUILD.gn2
-rw-r--r--base/base.gyp26
-rw-r--r--base/base_unittests.isolate7
-rw-r--r--base/process/memory_unittest.cc11
-rw-r--r--base/test/BUILD.gn10
-rw-r--r--base/test/malloc_wrapper.cc11
-rw-r--r--base/test/malloc_wrapper.h21
7 files changed, 77 insertions, 11 deletions
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 8b9b5bf..1ed1379 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1339,6 +1339,8 @@ test("base_unittests") {
if (is_linux) {
sources -= [ "file_version_info_unittest.cc" ]
sources += [ "nix/xdg_util_unittest.cc" ]
+ deps += [ "//base/test:malloc_wrapper" ]
+
if (use_glib) {
configs += [ "//build/config/linux:glib" ]
}
diff --git a/base/base.gyp b/base/base.gyp
index 5fafb4b..127f7a5 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -447,6 +447,16 @@
],
},
{
+ 'target_name': 'malloc_wrapper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'base',
+ ],
+ 'sources': [
+ 'test/malloc_wrapper.cc',
+ ],
+ },
+ {
'target_name': 'base_unittests',
'type': '<(gtest_target_type)',
'sources': [
@@ -758,11 +768,17 @@
'message_loop/message_pump_glib_unittest.cc',
]
}],
- ['OS == "linux" and use_allocator!="none"', {
- 'dependencies': [
- 'allocator/allocator.gyp:allocator',
- ],
- },
+ ['OS == "linux"', {
+ 'dependencies': [
+ 'malloc_wrapper',
+ ],
+ 'conditions': [
+ ['use_allocator!="none"', {
+ 'dependencies': [
+ 'allocator/allocator.gyp:allocator',
+ ],
+ }],
+ ]},
],
['OS == "win"', {
'sources!': [
diff --git a/base/base_unittests.isolate b/base/base_unittests.isolate
index e329152..b1c270c 100644
--- a/base/base_unittests.isolate
+++ b/base/base_unittests.isolate
@@ -50,6 +50,13 @@
'read_only': 1,
},
}],
+ ['OS=="linux"', {
+ 'variables': {
+ 'files': [
+ '<(PRODUCT_DIR)/lib/libmalloc_wrapper.so',
+ ],
+ },
+ }],
['OS=="mac" and asan==1 and fastbuild==0', {
'variables': {
'files': [
diff --git a/base/process/memory_unittest.cc b/base/process/memory_unittest.cc
index 50ba098..2e64fd7 100644
--- a/base/process/memory_unittest.cc
+++ b/base/process/memory_unittest.cc
@@ -26,6 +26,7 @@
#endif
#if defined(OS_LINUX)
#include <malloc.h>
+#include "base/test/malloc_wrapper.h"
#endif
#if defined(OS_WIN)
@@ -234,13 +235,11 @@ TEST_F(OutOfMemoryDeathTest, Memalign) {
TEST_F(OutOfMemoryDeathTest, ViaSharedLibraries) {
// This tests that the run-time symbol resolution is overriding malloc for
- // shared libraries (including libc itself) as well as for our code.
- std::string format = base::StringPrintf("%%%zud", test_size_);
- char *value = NULL;
+ // shared libraries as well as for our code.
ASSERT_DEATH({
- SetUpInDeathAssert();
- EXPECT_EQ(-1, asprintf(&value, format.c_str(), 0));
- }, "");
+ SetUpInDeathAssert();
+ value_ = MallocWrapper(test_size_);
+ }, "");
}
#endif // OS_LINUX
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index c4356cb..b94a4c7 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -183,6 +183,16 @@ source_set("run_all_unittests") {
]
}
+shared_library("malloc_wrapper") {
+ testonly = true
+ sources = [
+ "malloc_wrapper.cc",
+ ]
+ deps = [
+ "//base",
+ ]
+}
+
if (is_android) {
generate_jni("base_unittests_jni_headers") {
sources = [
diff --git a/base/test/malloc_wrapper.cc b/base/test/malloc_wrapper.cc
new file mode 100644
index 0000000..eb280a3
--- /dev/null
+++ b/base/test/malloc_wrapper.cc
@@ -0,0 +1,11 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "malloc_wrapper.h"
+
+#include <stdlib.h>
+
+void* MallocWrapper(size_t size) {
+ return malloc(size);
+}
diff --git a/base/test/malloc_wrapper.h b/base/test/malloc_wrapper.h
new file mode 100644
index 0000000..0fa7dbb
--- /dev/null
+++ b/base/test/malloc_wrapper.h
@@ -0,0 +1,21 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TEST_MALLOC_WRAPPER_H_
+#define BASE_TEST_MALLOC_WRAPPER_H_
+
+#include "base/basictypes.h"
+
+// BASE_EXPORT depends on COMPONENT_BUILD.
+// This will always be a separate shared library, so don't use BASE_EXPORT here.
+#if defined(WIN32)
+#define MALLOC_WRAPPER_EXPORT __declspec(dllexport)
+#else
+#define MALLOC_WRAPPER_EXPORT __attribute__((visibility("default")))
+#endif // defined(WIN32)
+
+// Calls malloc directly.
+MALLOC_WRAPPER_EXPORT void* MallocWrapper(size_t size);
+
+#endif // BASE_TEST_MALLOC_WRAPPER_H_