summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/hwasan/hwasan_allocator.cc
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2018-08-24 01:12:26 +0000
committerKostya Serebryany <kcc@google.com>2018-08-24 01:12:26 +0000
commitc5f98d2ab24c466d39434c0e34f6826a77d5a0b7 (patch)
tree076ce3e3f1c6a707c289a91a3ac027e04792e683 /compiler-rt/lib/hwasan/hwasan_allocator.cc
parent0b87d056793f0bfaea13f62fd5a7bd420131dfda (diff)
downloadbcm5719-llvm-c5f98d2ab24c466d39434c0e34f6826a77d5a0b7.tar.gz
bcm5719-llvm-c5f98d2ab24c466d39434c0e34f6826a77d5a0b7.zip
[hwasan] implement detection of double-free (invalid-free)
llvm-svn: 340591
Diffstat (limited to 'compiler-rt/lib/hwasan/hwasan_allocator.cc')
-rw-r--r--compiler-rt/lib/hwasan/hwasan_allocator.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/compiler-rt/lib/hwasan/hwasan_allocator.cc b/compiler-rt/lib/hwasan/hwasan_allocator.cc
index 23e919e79e0..95dcc074d35 100644
--- a/compiler-rt/lib/hwasan/hwasan_allocator.cc
+++ b/compiler-rt/lib/hwasan/hwasan_allocator.cc
@@ -24,6 +24,7 @@
#include "hwasan_mapping.h"
#include "hwasan_thread.h"
#include "hwasan_poisoning.h"
+#include "hwasan_report.h"
namespace __hwasan {
@@ -173,11 +174,21 @@ static void *HwasanAllocate(StackTrace *stack, uptr size, uptr alignment,
return user_ptr;
}
+static bool PointerAndMemoryTagsMatch(void *user_ptr) {
+ CHECK(user_ptr);
+ tag_t ptr_tag = GetTagFromPointer(reinterpret_cast<uptr>(user_ptr));
+ tag_t mem_tag = *reinterpret_cast<tag_t *>(
+ MEM_TO_SHADOW(GetAddressFromPointer(user_ptr)));
+ return ptr_tag == mem_tag;
+}
+
void HwasanDeallocate(StackTrace *stack, void *user_ptr) {
CHECK(user_ptr);
HWASAN_FREE_HOOK(user_ptr);
void *p = GetAddressFromPointer(user_ptr);
+ if (!PointerAndMemoryTagsMatch(user_ptr))
+ ReportInvalidFree(stack, reinterpret_cast<uptr>(user_ptr));
Metadata *meta = reinterpret_cast<Metadata *>(allocator.GetMetaData(p));
uptr size = meta->requested_size;
meta->state = CHUNK_FREE;
@@ -226,7 +237,7 @@ void *HwasanReallocate(StackTrace *stack, void *user_old_p, uptr new_size,
t ? t->GenerateRandomTag() : kFallbackAllocTag);
}
if (new_size > old_size) {
- tag_t tag = GetTagFromPointer((uptr)user_old_p);
+ tag_t tag = GetTagFromPointer(reinterpret_cast<uptr>(user_old_p));
TagMemoryAligned((uptr)old_p + old_size, new_size - old_size, tag);
}
return user_old_p;
OpenPOWER on IntegriCloud