X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fmem%2Fmem.c;h=13027a2a7b0fec1b18ae386f9704d84aed41c5f1;hb=7a353c03e5e8cdd55cbc0917f9ecff5cf9beefdb;hp=5b4b3508090dfb10dc7eea9236eb42ed54b92834;hpb=428d3b0217b32892c2fd309358619a4877113833;p=ccan diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index 5b4b3508..13027a2a 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -88,3 +88,41 @@ void memswap(void *a, void *b, size_t n) n -= m; } } + +bool memeqzero(const void *data, size_t length) +{ + const unsigned char *p = data; + size_t len; + + /* Check first 16 bytes manually */ + for (len = 0; len < 16; len++) { + if (!length) + return true; + if (*p) + return false; + p++; + 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 +}