From: Rusty Russell Date: Wed, 3 Feb 2016 03:41:38 +0000 (+1030) Subject: mem: add memtaint(). X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=a934320836ffaad26be1e3160df30ef7350c39d5 mem: add memtaint(). Useful if you're going to reuse a buffer later. Signed-off-by: Rusty Russell --- 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 */