Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-03-02 03:41:55 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-03-02 03:50:44 +0300
commitb5d87f802806df6f19d53213d31acbc6f26864b6 (patch)
tree9e79b720d0ff8629eb2b18341f1c8eb39440d826 /source/blender/blenlib/intern/BLI_memarena.c
parent4d9bf4fc6ce29f95abff6020e51ae3b78a79df89 (diff)
BLI_memarena: use ASAN memory poison
Detects invalid memory use when WITH_COMPILER_ASAN is enabled.
Diffstat (limited to 'source/blender/blenlib/intern/BLI_memarena.c')
-rw-r--r--source/blender/blenlib/intern/BLI_memarena.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c
index 4461e999b0b..2521320da97 100644
--- a/source/blender/blenlib/intern/BLI_memarena.c
+++ b/source/blender/blenlib/intern/BLI_memarena.c
@@ -47,6 +47,17 @@
# define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) UNUSED_VARS(pool, addr, size)
#endif
+/* Clang defines this. */
+#ifndef __has_feature
+# define __has_feature(x) 0
+#endif
+#if defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer)
+# include "sanitizer/asan_interface.h"
+#else
+# define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
+# define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
+#endif
+
struct MemBuf {
struct MemBuf *next;
uchar data[0];
@@ -143,6 +154,8 @@ void *BLI_memarena_alloc(MemArena *ma, size_t size)
mb->next = ma->bufs;
ma->bufs = mb;
+ ASAN_POISON_MEMORY_REGION(ma->curbuf, ma->cursize);
+
memarena_curbuf_align(ma);
}
@@ -152,6 +165,8 @@ void *BLI_memarena_alloc(MemArena *ma, size_t size)
VALGRIND_MEMPOOL_ALLOC(ma, ptr, size);
+ ASAN_UNPOISON_MEMORY_REGION(ptr, size);
+
return ptr;
}
@@ -194,6 +209,7 @@ void BLI_memarena_clear(MemArena *ma)
if (ma->use_calloc) {
memset(ma->curbuf, 0, curbuf_used);
}
+ ASAN_POISON_MEMORY_REGION(ma->curbuf, ma->cursize);
}
VALGRIND_DESTROY_MEMPOOL(ma);