Index: src/zone-inl.h |
diff --git a/src/zone-inl.h b/src/zone-inl.h |
index f257382a2dba5b118cadb98e83c1da68b58ad27a..9a5de34acb636a826b06dce5158e20b4229beff0 100644 |
--- a/src/zone-inl.h |
+++ b/src/zone-inl.h |
@@ -30,6 +30,12 @@ |
#include "zone.h" |
+#ifdef ADDRESS_SANITIZER |
+ #include <sanitizer/asan_interface.h> |
+#else |
+ #define ASAN_UNPOISON_MEMORY_REGION(start, size) ((void) 0) |
+#endif |
+ |
#include "counters.h" |
#include "isolate.h" |
#include "utils.h" |
@@ -39,6 +45,9 @@ namespace v8 { |
namespace internal { |
+static const int kASanRedzoneBytes = 24; // Must be a multiple of 8. |
+ |
+ |
inline void* Zone::New(int size) { |
// Round up the requested size to fit the alignment. |
size = RoundUp(size, kAlignment); |
@@ -54,12 +63,25 @@ inline void* Zone::New(int size) { |
// Check if the requested size is available without expanding. |
Address result = position_; |
- if (size > limit_ - position_) { |
- result = NewExpand(size); |
+ int size_with_redzone = |
+#ifdef ADDRESS_SANITIZER |
+ size + kASanRedzoneBytes; |
+#else |
+ size; |
+#endif |
+ |
+ if (size_with_redzone > limit_ - position_) { |
+ result = NewExpand(size_with_redzone); |
} else { |
- position_ += size; |
+ position_ += size_with_redzone; |
} |
+#ifdef ADDRESS_SANITIZER |
+ Address redzone_position = result + size; |
+ ASSERT(redzone_position + kASanRedzoneBytes == position_); |
+ ASAN_POISON_MEMORY_REGION(redzone_position, kASanRedzoneBytes); |
+#endif |
+ |
// Check that the result has the proper alignment and return it. |
ASSERT(IsAddressAligned(result, kAlignment, 0)); |
allocation_size_ += size; |
@@ -69,6 +91,7 @@ inline void* Zone::New(int size) { |
template <typename T> |
T* Zone::NewArray(int length) { |
+ CHECK(std::numeric_limits<int>::max() / static_cast<int>(sizeof(T)) > length); |
return static_cast<T*>(New(length * sizeof(T))); |
} |