summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThirunarayanan Balathandayuthapani <thiru@mariadb.com>2020-06-16 19:57:33 +0530
committerThirunarayanan Balathandayuthapani <thiru@mariadb.com>2020-06-16 20:03:35 +0530
commitd0c69ccab523d2bc2ea8f381c519ac47ec42ff9f (patch)
tree243effcb57e43cca239d40567e890f796f82a455
parent72fc4f3fef52629903f8397a0dc0083c94f8de09 (diff)
downloadmariadb-git-d0c69ccab523d2bc2ea8f381c519ac47ec42ff9f.tar.gz
MDEV-22911: Fix the valgrind & MSAN instrumentation of MDEV-8139
MEM_GET_VBITS(): Save information about uninitialized data. MEM_SET_VBITS(): Restore information about uninitialized data.
-rw-r--r--include/my_valgrind.h8
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc7
2 files changed, 13 insertions, 2 deletions
diff --git a/include/my_valgrind.h b/include/my_valgrind.h
index 8aaa261fd5b..1de6714700b 100644
--- a/include/my_valgrind.h
+++ b/include/my_valgrind.h
@@ -38,6 +38,8 @@
# define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len)
# define MEM_CHECK_ADDRESSABLE(a,len) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,len)
# define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len)
+# define MEM_GET_VBITS(a,b,len) VALGRIND_GET_VBITS(a,b,len)
+# define MEM_SET_VBITS(a,b,len) VALGRIND_SET_VBITS(a,b,len)
# define REDZONE_SIZE 8
#elif defined(__SANITIZE_ADDRESS__)
# include <sanitizer/asan_interface.h>
@@ -48,6 +50,8 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
# define MEM_NOACCESS(a,len) ASAN_POISON_MEMORY_REGION(a,len)
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
# define MEM_CHECK_DEFINED(a,len) ((void) 0)
+# define MEM_GET_VBITS(a,b,len) ((void) 0)
+# define MEM_SET_VBITS(a,b,len) ((void) 0)
# define REDZONE_SIZE 8
#elif __has_feature(memory_sanitizer)
# include <sanitizer/msan_interface.h>
@@ -57,6 +61,8 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
# define MEM_NOACCESS(a,len) ((void) 0)
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
# define MEM_CHECK_DEFINED(a,len) __msan_check_mem_is_initialized(a,len)
+# define MEM_GET_VBITS(a,b,len) __msan_copy_shadow(b,a,len)
+# define MEM_SET_VBITS(a,b,len) __msan_copy_shadow(a,b,len)
# define REDZONE_SIZE 8
#else
# define MEM_UNDEFINED(a,len) ((void) (a), (void) (len))
@@ -64,6 +70,8 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
# define MEM_NOACCESS(a,len) ((void) 0)
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
# define MEM_CHECK_DEFINED(a,len) ((void) 0)
+# define MEM_GET_VBITS(a,b,len) ((void) 0)
+# define MEM_SET_VBITS(a,b,len) ((void) 0)
# define REDZONE_SIZE 0
#endif /* HAVE_VALGRIND_MEMCHECK_H */
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index 66b6d2976b8..0997a735699 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -354,9 +354,12 @@ struct mtr_write_log_t {
/** Start a mini-transaction. */
void mtr_t::start()
{
- MEM_CHECK_DEFINED(&m_freed_ranges, sizeof m_freed_ranges);
+#ifdef HAVE_valgrind_or_MSAN
+ char m_freed_ranges_vbits[sizeof m_freed_ranges];
+#endif
+ MEM_GET_VBITS(&m_freed_ranges, m_freed_ranges_vbits, sizeof m_freed_ranges);
UNIV_MEM_INVALID(this, sizeof *this);
- UNIV_MEM_VALID(&m_freed_ranges, sizeof m_freed_ranges);
+ MEM_SET_VBITS(&m_freed_ranges, m_freed_ranges_vbits, sizeof m_freed_ranges);
ut_d(m_start= true);
ut_d(m_commit= false);