Merge "Add support for new scudo mallopt options."

This commit is contained in:
Christopher Ferris 2020-07-29 16:38:06 +00:00 committed by Gerrit Code Review
commit 3025f128f3
2 changed files with 62 additions and 0 deletions

View file

@ -170,6 +170,28 @@ int malloc_info(int __must_be_zero, FILE* __fp) __INTRODUCED_IN(23);
* Available since API level 28.
*/
#define M_PURGE (-101)
/**
* mallopt() option to set the maximum number of items in the secondary
* cache of the scudo allocator.
*
* Available since API level 31.
*/
#define M_CACHE_COUNT_MAX (-200)
/**
* mallopt() option to set the maximum size in bytes of a cacheable item in
* the secondary cache of the scudo allocator.
*
* Available since API level 31.
*/
#define M_CACHE_SIZE_MAX (-201)
/**
* mallopt() option to increase the maximum number of shared thread-specific
* data structures that can be created. This number cannot be decreased,
* only increased and only applies to the scudo allocator.
*
* Available since API level 31.
*/
#define M_TSDS_COUNT_MAX (-202)
/**
* [mallopt(3)](http://man7.org/linux/man-pages/man3/mallopt.3.html) modifies

View file

@ -662,6 +662,46 @@ TEST(malloc, mallopt_purge) {
#endif
}
#if defined(__BIONIC__)
static void GetAllocatorVersion(bool* allocator_scudo) {
TemporaryFile tf;
ASSERT_TRUE(tf.fd != -1);
FILE* fp = fdopen(tf.fd, "w+");
tf.release();
ASSERT_TRUE(fp != nullptr);
ASSERT_EQ(0, malloc_info(0, fp));
ASSERT_EQ(0, fclose(fp));
std::string contents;
ASSERT_TRUE(android::base::ReadFileToString(tf.path, &contents));
tinyxml2::XMLDocument doc;
ASSERT_EQ(tinyxml2::XML_SUCCESS, doc.Parse(contents.c_str()));
auto root = doc.FirstChildElement();
ASSERT_NE(nullptr, root);
ASSERT_STREQ("malloc", root->Name());
std::string version(root->Attribute("version"));
*allocator_scudo = (version == "scudo-1");
}
#endif
TEST(malloc, mallopt_scudo_only_options) {
#if defined(__BIONIC__)
SKIP_WITH_HWASAN << "hwasan does not implement mallopt";
bool allocator_scudo;
GetAllocatorVersion(&allocator_scudo);
if (!allocator_scudo) {
GTEST_SKIP() << "scudo allocator only test";
}
ASSERT_EQ(1, mallopt(M_CACHE_COUNT_MAX, 100));
ASSERT_EQ(1, mallopt(M_CACHE_SIZE_MAX, 1024 * 1024 * 2));
ASSERT_EQ(1, mallopt(M_TSDS_COUNT_MAX, 8));
#else
GTEST_SKIP() << "bionic-only test";
#endif
}
TEST(malloc, reallocarray_overflow) {
#if HAVE_REALLOCARRAY
// Values that cause overflow to a result small enough (8 on LP64) that malloc would "succeed".