From f2f016e741b4e82902de96e0d3ebb0dbf51c58c5 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 19 Oct 2020 13:18:45 -0700 Subject: [PATCH] Fix SharedBuffer tests to pass under hwasan. Allocating the entire address space is sufficiently unreasonable that hwasan blows you out of the water if you try to do that. Half the address space feels like it's large enough to be guaranteed to fail (which is all I think this intended to test) without being quite so obviously incorrect that tools like hwasan are going to object... ...except hwasan actually has a 2GiB limit. So let's keep the cleanup, but also just disable these tests if they're running under hwasan for now. Bug: https://issuetracker.google.com/171054277 Test: treehugger Change-Id: I41f3def5c3a43aa7f9ca3a130b4306ebed659d6a --- libutils/SharedBuffer_test.cpp | 67 +++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/libutils/SharedBuffer_test.cpp b/libutils/SharedBuffer_test.cpp index 33a4e0c90..3f960d2f5 100644 --- a/libutils/SharedBuffer_test.cpp +++ b/libutils/SharedBuffer_test.cpp @@ -23,36 +23,45 @@ #include "SharedBuffer.h" -TEST(SharedBufferTest, TestAlloc) { - EXPECT_DEATH(android::SharedBuffer::alloc(SIZE_MAX), ""); - EXPECT_DEATH(android::SharedBuffer::alloc(SIZE_MAX - sizeof(android::SharedBuffer)), ""); +extern "C" void __hwasan_init() __attribute__((weak)); +#define SKIP_WITH_HWASAN \ + if (&__hwasan_init != 0) GTEST_SKIP() - // Make sure we don't die here. - // Check that null is returned, as we are asking for the whole address space. - android::SharedBuffer* buf = - android::SharedBuffer::alloc(SIZE_MAX - sizeof(android::SharedBuffer) - 1); - ASSERT_EQ(nullptr, buf); - - buf = android::SharedBuffer::alloc(0); - ASSERT_NE(nullptr, buf); - ASSERT_EQ(0U, buf->size()); - buf->release(); +TEST(SharedBufferTest, alloc_death) { + EXPECT_DEATH(android::SharedBuffer::alloc(SIZE_MAX), ""); + EXPECT_DEATH(android::SharedBuffer::alloc(SIZE_MAX - sizeof(android::SharedBuffer)), ""); } -TEST(SharedBufferTest, TestEditResize) { - android::SharedBuffer* buf = android::SharedBuffer::alloc(10); - EXPECT_DEATH(buf->editResize(SIZE_MAX - sizeof(android::SharedBuffer)), ""); - buf = android::SharedBuffer::alloc(10); - EXPECT_DEATH(buf->editResize(SIZE_MAX), ""); - - buf = android::SharedBuffer::alloc(10); - // Make sure we don't die here. - // Check that null is returned, as we are asking for the whole address space. - buf = buf->editResize(SIZE_MAX - sizeof(android::SharedBuffer) - 1); - ASSERT_EQ(nullptr, buf); - - buf = android::SharedBuffer::alloc(10); - buf = buf->editResize(0); - ASSERT_EQ(0U, buf->size()); - buf->release(); +TEST(SharedBufferTest, alloc_null) { + // Big enough to fail, not big enough to abort. + SKIP_WITH_HWASAN; // hwasan has a 2GiB allocation limit. + ASSERT_EQ(nullptr, android::SharedBuffer::alloc(SIZE_MAX / 2)); +} + +TEST(SharedBufferTest, alloc_zero_size) { + android::SharedBuffer* buf = android::SharedBuffer::alloc(0); + ASSERT_NE(nullptr, buf); + ASSERT_EQ(0U, buf->size()); + buf->release(); +} + +TEST(SharedBufferTest, editResize_death) { + android::SharedBuffer* buf = android::SharedBuffer::alloc(10); + EXPECT_DEATH(buf->editResize(SIZE_MAX - sizeof(android::SharedBuffer)), ""); + buf = android::SharedBuffer::alloc(10); + EXPECT_DEATH(buf->editResize(SIZE_MAX), ""); +} + +TEST(SharedBufferTest, editResize_null) { + // Big enough to fail, not big enough to abort. + SKIP_WITH_HWASAN; // hwasan has a 2GiB allocation limit. + android::SharedBuffer* buf = android::SharedBuffer::alloc(10); + ASSERT_EQ(nullptr, buf->editResize(SIZE_MAX / 2)); +} + +TEST(SharedBufferTest, editResize_zero_size) { + android::SharedBuffer* buf = android::SharedBuffer::alloc(10); + buf = buf->editResize(0); + ASSERT_EQ(0U, buf->size()); + buf->release(); }