| 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)));
|
| }
|
|
|
|
|