X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fhash.c;h=abc7c4ce4a27f4d9dcde6b84bfc7606d6760ec8d;hb=73710c7da2f8deaea83dbbbfce8737c9c6cd2949;hp=062ad8823e1669635850952dc4013739070b35cd;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vppinfra/hash.c b/src/vppinfra/hash.c index 062ad8823e1..abc7c4ce4a2 100644 --- a/src/vppinfra/hash.c +++ b/src/vppinfra/hash.c @@ -96,7 +96,17 @@ zap64 (u64 x, word n) return x & masks_little_endian[n]; } -static inline u64 +/** + * make address-sanitizer skip this: + * clib_mem_unaligned + zap64 casts its input as u64, computes a mask + * according to the input length, and returns the casted maked value. + * Therefore all the 8 Bytes of the u64 are systematically read, which + * rightfully causes address-sanitizer to raise an error on smaller inputs. + * + * However the invalid Bytes are discarded within zap64(), whicj is why + * this can be silenced safely. + */ +static inline u64 __attribute__ ((no_sanitize_address)) hash_memory64 (void *p, word n_bytes, u64 state) { u64 *q = p; @@ -272,6 +282,10 @@ key_sum (hash_t * h, uword key) sum = string_key_sum (h, key); break; + case KEY_FUNC_MEM: + sum = mem_key_sum (h, key); + break; + default: sum = h->key_sum (h, key); break; @@ -302,6 +316,10 @@ key_equal1 (hash_t * h, uword key1, uword key2, uword e) e = string_key_equal (h, key1, key2); break; + case KEY_FUNC_MEM: + e = mem_key_equal (h, key1, key2); + break; + default: e = h->key_equal (h, key1, key2); break; @@ -675,7 +693,7 @@ _hash_create (uword elts, hash_t * h_user) if (h_user) log2_pair_size = h_user->log2_pair_size; - v = _vec_resize (0, + v = _vec_resize ((void *) 0, /* vec len: */ elts, /* data bytes: */ (elts << log2_pair_size) * sizeof (hash_pair_t),