From 67d508d0830369dbbecf4218a35130bb2231e919 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 17 Jan 2012 14:01:15 +0000 Subject: [PATCH] Revert commit 148304 llvm-svn: 148305 --- compiler-rt/lib/asan/asan_allocator.cc | 32 +++++++++++++++---- compiler-rt/lib/asan/asan_interface.h | 4 +-- .../lib/asan/tests/asan_interface_test.cc | 6 ++-- compiler-rt/lib/asan/tests/asan_test.cc | 2 +- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/compiler-rt/lib/asan/asan_allocator.cc b/compiler-rt/lib/asan/asan_allocator.cc index e0525a7f4476..b5de1f85dc0c 100644 --- a/compiler-rt/lib/asan/asan_allocator.cc +++ b/compiler-rt/lib/asan/asan_allocator.cc @@ -811,10 +811,22 @@ int asan_posix_memalign(void **memptr, size_t alignment, size_t size, return 0; } +static void GetAllocationSizeAndOwnership(const void *ptr, size_t *size, + bool *owned) { + size_t allocation_size = malloc_info.AllocationSize((uintptr_t)ptr); + if (size != NULL) { + *size = allocation_size; + } + if (owned != NULL) { + *owned = (ptr == NULL) || (allocation_size > 0); + } +} + size_t asan_malloc_usable_size(void *ptr, AsanStackTrace *stack) { - CHECK(stack); - size_t usable_size = malloc_info.AllocationSize((uintptr_t)ptr); - if (usable_size == 0) { + size_t usable_size; + bool owned; + GetAllocationSizeAndOwnership(ptr, &usable_size, &owned); + if (!owned) { Report("ERROR: AddressSanitizer attempting to call malloc_usable_size() " "for pointer which is not owned: %p\n", ptr); stack->PrintStack(); @@ -825,7 +837,9 @@ size_t asan_malloc_usable_size(void *ptr, AsanStackTrace *stack) { } size_t asan_mz_size(const void *ptr) { - return malloc_info.AllocationSize((uintptr_t)ptr); + size_t mz_size; + GetAllocationSizeAndOwnership(ptr, &mz_size, NULL); + return mz_size; } void DescribeHeapAddress(uintptr_t addr, uintptr_t access_size) { @@ -1012,13 +1026,17 @@ size_t __asan_get_estimated_allocated_size(size_t size) { } bool __asan_get_ownership(const void *p) { - return malloc_info.AllocationSize((uintptr_t)p) > 0; + bool owned; + GetAllocationSizeAndOwnership(p, NULL, &owned); + return owned; } size_t __asan_get_allocated_size(const void *p) { - size_t allocated_size = malloc_info.AllocationSize((uintptr_t)p); + size_t allocated_size; + bool owned; + GetAllocationSizeAndOwnership(p, &allocated_size, &owned); // Die if p is not malloced or if it is already freed. - if (allocated_size == 0) { + if (!owned) { Report("ERROR: AddressSanitizer attempting to call " "__asan_get_allocated_size() for pointer which is " "not owned: %p\n", p); diff --git a/compiler-rt/lib/asan/asan_interface.h b/compiler-rt/lib/asan/asan_interface.h index 90598b40ff8d..7506586fefeb 100644 --- a/compiler-rt/lib/asan/asan_interface.h +++ b/compiler-rt/lib/asan/asan_interface.h @@ -107,11 +107,11 @@ extern "C" { // memory, returns the maximal possible allocation size, otherwise returns // "size". size_t __asan_get_estimated_allocated_size(size_t size); - // Returns true if p was returned by the ASan allocator and + // Returns true if p is NULL or if p was returned by the ASan allocator and // is not yet freed. bool __asan_get_ownership(const void *p); // Returns the number of bytes reserved for the pointer p. - // Requires (__asan_get_ownership(p) == true). + // Requires (get_ownership(p) == true). size_t __asan_get_allocated_size(const void *p); // Number of bytes, allocated and not yet freed by the application. size_t __asan_get_current_allocated_bytes(); diff --git a/compiler-rt/lib/asan/tests/asan_interface_test.cc b/compiler-rt/lib/asan/tests/asan_interface_test.cc index 44a93f9923d7..521853ec756f 100644 --- a/compiler-rt/lib/asan/tests/asan_interface_test.cc +++ b/compiler-rt/lib/asan/tests/asan_interface_test.cc @@ -44,14 +44,16 @@ TEST(AddressSanitizerInterface, GetAllocatedSizeAndOwnershipTest) { // We cannot call GetAllocatedSize from the memory we didn't map, // and from the interior pointers (not returned by previous malloc). void *wild_addr = (void*)0x1; - EXPECT_EQ(false, __asan_get_ownership(NULL)); - EXPECT_DEATH(__asan_get_allocated_size(NULL), kGetAllocatedSizeErrorMsg); EXPECT_EQ(false, __asan_get_ownership(wild_addr)); EXPECT_DEATH(__asan_get_allocated_size(wild_addr), kGetAllocatedSizeErrorMsg); EXPECT_EQ(false, __asan_get_ownership(array + kArraySize / 2)); EXPECT_DEATH(__asan_get_allocated_size(array + kArraySize / 2), kGetAllocatedSizeErrorMsg); + // NULL is a valid argument and is owned. + EXPECT_EQ(true, __asan_get_ownership(NULL)); + EXPECT_EQ(0, __asan_get_allocated_size(NULL)); + // When memory is freed, it's not owned, and call to GetAllocatedSize // is forbidden. free(array); diff --git a/compiler-rt/lib/asan/tests/asan_test.cc b/compiler-rt/lib/asan/tests/asan_test.cc index ca4aab6fd717..363bb893e981 100644 --- a/compiler-rt/lib/asan/tests/asan_test.cc +++ b/compiler-rt/lib/asan/tests/asan_test.cc @@ -528,9 +528,9 @@ TEST(AddressSanitizer, MallocUsableSizeTest) { const size_t kArraySize = 100; char *array = Ident((char*)malloc(kArraySize)); int *int_ptr = Ident(new int); + EXPECT_EQ(0, malloc_usable_size(NULL)); EXPECT_EQ(kArraySize, malloc_usable_size(array)); EXPECT_EQ(sizeof(int), malloc_usable_size(int_ptr)); - EXPECT_DEATH(malloc_usable_size(NULL), kMallocUsableSizeErrorMsg); EXPECT_DEATH(malloc_usable_size((void*)0x123), kMallocUsableSizeErrorMsg); EXPECT_DEATH(malloc_usable_size(array + kArraySize / 2), kMallocUsableSizeErrorMsg);