AddressSanitizer: return false instead of true for __asan_get_ownership(NULL)

git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@148394 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/asan/asan_allocator.cc b/lib/asan/asan_allocator.cc
index b5de1f8..2ce859c 100644
--- a/lib/asan/asan_allocator.cc
+++ b/lib/asan/asan_allocator.cc
@@ -341,6 +341,7 @@
   // page_groups_ grows. This can be fixed by increasing kMinMmapSize,
   // but a better solution is to speed up the search somehow.
   size_t AllocationSize(uintptr_t ptr) {
+    if (!ptr) return 0;
     ScopedLock lock(&mu_);
 
     // first, check if this is our memory
@@ -811,22 +812,11 @@
   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) {
-  size_t usable_size;
-  bool owned;
-  GetAllocationSizeAndOwnership(ptr, &usable_size, &owned);
-  if (!owned) {
+  CHECK(stack);
+  if (ptr == NULL) return 0;
+  size_t usable_size = malloc_info.AllocationSize((uintptr_t)ptr);
+  if (usable_size == 0) {
     Report("ERROR: AddressSanitizer attempting to call malloc_usable_size() "
            "for pointer which is not owned: %p\n", ptr);
     stack->PrintStack();
@@ -837,9 +827,7 @@
 }
 
 size_t asan_mz_size(const void *ptr) {
-  size_t mz_size;
-  GetAllocationSizeAndOwnership(ptr, &mz_size, NULL);
-  return mz_size;
+  return malloc_info.AllocationSize((uintptr_t)ptr);
 }
 
 void DescribeHeapAddress(uintptr_t addr, uintptr_t access_size) {
@@ -1026,17 +1014,14 @@
 }
 
 bool __asan_get_ownership(const void *p) {
-  bool owned;
-  GetAllocationSizeAndOwnership(p, NULL, &owned);
-  return owned;
+  return malloc_info.AllocationSize((uintptr_t)p) > 0;
 }
 
 size_t __asan_get_allocated_size(const void *p) {
-  size_t allocated_size;
-  bool owned;
-  GetAllocationSizeAndOwnership(p, &allocated_size, &owned);
+  if (p == NULL) return 0;
+  size_t allocated_size = malloc_info.AllocationSize((uintptr_t)p);
   // Die if p is not malloced or if it is already freed.
-  if (!owned) {
+  if (allocated_size == 0) {
     Report("ERROR: AddressSanitizer attempting to call "
            "__asan_get_allocated_size() for pointer which is "
            "not owned: %p\n", p);
diff --git a/lib/asan/asan_interface.h b/lib/asan/asan_interface.h
index 7506586..287916b 100644
--- a/lib/asan/asan_interface.h
+++ b/lib/asan/asan_interface.h
@@ -107,11 +107,11 @@
   // memory, returns the maximal possible allocation size, otherwise returns
   // "size".
   size_t __asan_get_estimated_allocated_size(size_t size);
-  // Returns true if p is NULL or if p was returned by the ASan allocator and
+  // Returns true 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 (get_ownership(p) == true).
+  // Requires (get_ownership(p) == true) or (p == NULL).
   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/lib/asan/tests/asan_interface_test.cc b/lib/asan/tests/asan_interface_test.cc
index 521853e..d17353d 100644
--- a/lib/asan/tests/asan_interface_test.cc
+++ b/lib/asan/tests/asan_interface_test.cc
@@ -50,8 +50,8 @@
   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));
+  // NULL is not owned, but is a valid argument for __asan_get_allocated_size().
+  EXPECT_EQ(false, __asan_get_ownership(NULL));
   EXPECT_EQ(0, __asan_get_allocated_size(NULL));
 
   // When memory is freed, it's not owned, and call to GetAllocatedSize