X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fmem%2Fmem.c;h=5eb15070ed3c3f9f5bf8d2dd8b0d0f060ffa1766;hb=HEAD;hp=2dfc72a506209511c0d61901024a470a28472d84;hpb=299170fa67ff3cf664cbcd2c95c4a85d0d6e699d;p=ccan diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index 2dfc72a5..13027a2a 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -92,12 +92,37 @@ void memswap(void *a, void *b, size_t n) bool memeqzero(const void *data, size_t length) { const unsigned char *p = data; + size_t len; - while (length) { + /* Check first 16 bytes manually */ + for (len = 0; len < 16; len++) { + if (!length) + return true; if (*p) return false; p++; length--; } - return true; + + /* 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 }