X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fmem%2Fmem.c;h=13027a2a7b0fec1b18ae386f9704d84aed41c5f1;hb=ee77e470b467cf85dc533cee8c08e08bd4c9be06;hp=af41f9e011edbc6738667c3fc89d9d043b1dbcf6;hpb=b967dac8c71a2313c39910ef8ca0e1644fe178c0;p=ccan diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index af41f9e0..13027a2a 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -92,13 +92,37 @@ void memswap(void *a, void *b, size_t n) bool memeqzero(const void *data, size_t length) { const unsigned char *p = data; - static unsigned long zeroes[16]; + size_t len; - while (length > sizeof(zeroes)) { - if (memcmp(zeroes, p, sizeof(zeroes))) + /* Check first 16 bytes manually */ + for (len = 0; len < 16; len++) { + if (!length) + return true; + if (*p) return false; - p += sizeof(zeroes); - length -= sizeof(zeroes); + p++; + length--; } - return memcmp(zeroes, p, length) == 0; + + /* 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 }