summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kosov <claprix@yandex.ru>2018-03-20 10:46:57 +0300
committerEugene Kosov <claprix@yandex.ru>2018-03-20 10:46:57 +0300
commit5a8f8f89d65b75e51048288a49c86a8d974a8543 (patch)
tree1f879a7c5d62094cb8bf91c020bba061cb03505b
parent75c76dbb06a99359d867e2a516f3244bf41fde96 (diff)
downloadmariadb-git-5a8f8f89d65b75e51048288a49c86a8d974a8543.tar.gz
honor alignment rules and xtradb too
-rw-r--r--include/my_valgrind.h2
-rw-r--r--storage/innobase/mem/mem0mem.c5
-rw-r--r--storage/xtradb/mem/mem0mem.c5
3 files changed, 11 insertions, 1 deletions
diff --git a/include/my_valgrind.h b/include/my_valgrind.h
index b76f5607bb5..8dde079b976 100644
--- a/include/my_valgrind.h
+++ b/include/my_valgrind.h
@@ -35,6 +35,8 @@
# define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len)
#elif defined(__SANITIZE_ADDRESS__)
# include <sanitizer/asan_interface.h>
+/* How to do manual poisoning:
+https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
# define MEM_UNDEFINED(a,len) ASAN_UNPOISON_MEMORY_REGION(a,len)
# define MEM_NOACCESS(a,len) ASAN_POISON_MEMORY_REGION(a,len)
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
diff --git a/storage/innobase/mem/mem0mem.c b/storage/innobase/mem/mem0mem.c
index 31f235b1960..924231470aa 100644
--- a/storage/innobase/mem/mem0mem.c
+++ b/storage/innobase/mem/mem0mem.c
@@ -404,7 +404,10 @@ mem_heap_create_block(
heap->total_size += len;
}
- UNIV_MEM_FREE(block + 1, len - MEM_BLOCK_HEADER_SIZE);
+ /* Poison all available memory. Individual chunks will be unpoisoned on
+ every mem_heap_alloc() call. */
+ compile_time_assert(MEM_BLOCK_HEADER_SIZE >= sizeof *block);
+ UNIV_MEM_FREE(block + 1, len - sizeof *block);
ut_ad((ulint)MEM_BLOCK_HEADER_SIZE < len);
diff --git a/storage/xtradb/mem/mem0mem.c b/storage/xtradb/mem/mem0mem.c
index 6e9a39d329f..924231470aa 100644
--- a/storage/xtradb/mem/mem0mem.c
+++ b/storage/xtradb/mem/mem0mem.c
@@ -404,6 +404,11 @@ mem_heap_create_block(
heap->total_size += len;
}
+ /* Poison all available memory. Individual chunks will be unpoisoned on
+ every mem_heap_alloc() call. */
+ compile_time_assert(MEM_BLOCK_HEADER_SIZE >= sizeof *block);
+ UNIV_MEM_FREE(block + 1, len - sizeof *block);
+
ut_ad((ulint)MEM_BLOCK_HEADER_SIZE < len);
return(block);