From a934320836ffaad26be1e3160df30ef7350c39d5 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 3 Feb 2016 14:11:38 +1030 Subject: [PATCH] mem: add memtaint(). Useful if you're going to reuse a buffer later. Signed-off-by: Rusty Russell --- ccan/mem/mem.c | 19 +++++++++++++++++++ ccan/mem/mem.h | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index 5eb15070..13027a2a 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -107,3 +107,22 @@ bool memeqzero(const void *data, size_t length) /* Now we know that's zero, memcmp with self. */ return memcmp(data, p, length) == 0; } + +void memtaint(void *data, size_t len) +{ + /* Using 16 bytes is a bit quicker than 4 */ + const unsigned tainter[] + = { 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef }; + char *p = data; + + while (len >= sizeof(tainter)) { + memcpy(p, tainter, sizeof(tainter)); + p += sizeof(tainter); + len -= sizeof(tainter); + } + memcpy(p, tainter, len); + +#if HAVE_VALGRIND_MEMCHECK_H + VALGRIND_MAKE_MEM_UNDEFINED(data, len); +#endif +} diff --git a/ccan/mem/mem.h b/ccan/mem/mem.h index a3403c4e..f2c3d5c7 100644 --- a/ccan/mem/mem.h +++ b/ccan/mem/mem.h @@ -275,4 +275,20 @@ static inline void *memcheck_(const void *data, size_t len) #else #define memcheck(data, len) memcheck_((data), (len)) #endif + +/** + * memtaint - mark a memory region unused + * @data: start of region + * @len: length in bytes + * + * This writes an "0xdeadbeef" eyecatcher repeatedly to the memory. + * When running under valgrind, it also tells valgrind that the memory is + * uninitialized, triggering valgrind errors if it is used for branches + * or written out (or passed to memcheck!) in future. + * + * Example: + * // We'll reuse this buffer later, but be sure we don't access it. + * memtaint(somebytes, bytes_len); + */ +void memtaint(void *data, size_t len); #endif /* CCAN_MEM_H */ -- 2.39.2