diff --git a/src/common/util.c b/src/common/util.c index e80a15c649..39efee9cd2 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -428,13 +428,30 @@ find_whitespace(const char *s) return s; } +/** Return true iff the 'len' bytes at 'mem' are all zero. */ +int tor_mem_is_zero(const char *mem, size_t len) +{ + static const char ZERO[] = { + 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, + }; + while (len >= sizeof(ZERO)) { + if (memcmp(mem, ZERO, sizeof(ZERO))) + return 0; + len -= sizeof(ZERO); + mem += sizeof(ZERO); + } + /* Deal with leftover bytes. */ + if (len) + return ! memcmp(mem, ZERO, len); + + return 1; +} + /** Return true iff the DIGEST_LEN bytes in digest are all zero. */ int tor_digest_is_zero(const char *digest) { - static char ZERO_DIGEST[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - - return !memcmp(digest, ZERO_DIGEST, DIGEST_LEN); + return tor_mem_is_zero(digest, DIGEST_LEN); } #define CHECK_STRTOX_RESULT() \ diff --git a/src/common/util.h b/src/common/util.h index b61b399dec..bc21d2051f 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -88,6 +88,10 @@ extern int dmalloc_free(const char *file, const int line, void *pnt, #define tor_strndup(s, n) _tor_strndup(s, n DMALLOC_ARGS) #define tor_memdup(s, n) _tor_memdup(s, n DMALLOC_ARGS) +/** Return the offset of member within the type tp, in bytes */ +#define STRUCT_OFFSET(tp, member) \ + ((off_t) (((char*)&((tp*)0)->member)-(char*)0)) + /* String manipulation */ #define HEX_CHARACTERS "0123456789ABCDEFabcdef" void tor_strlower(char *s); @@ -114,6 +118,7 @@ const char *hex_str(const char *from, size_t fromlen); const char *eat_whitespace(const char *s); const char *eat_whitespace_no_nl(const char *s); const char *find_whitespace(const char *s); +int tor_mem_is_zero(const char *mem, size_t len); int tor_digest_is_zero(const char *digest); char *esc_for_log(const char *string); const char *escaped(const char *string);