dns_main_t dns_main;
+/* the cache hashtable expects a NULL-terminated C-string but everywhere else
+ * expects a non-NULL terminated vector... The pattern of adding \0 but hiding
+ * it away drives AddressSanitizer crazy, this helper tries to bring some of
+ * its sanity back
+ */
+static_always_inline void
+dns_terminate_c_string (u8 **v)
+{
+ vec_add1 (*v, 0);
+ vec_dec_len (*v, 1);
+ clib_mem_unpoison (vec_end (*v), 1);
+}
+
static int
dns_cache_clear (dns_main_t * dm)
{
pool_get (dm->entries, ep);
clib_memset (ep, 0, sizeof (*ep));
- ep->name = format (0, "%s%c", name, 0);
- vec_set_len (ep->name, vec_len (ep->name) - 1);
+ ep->name = format (0, "%s", name);
+ dns_terminate_c_string (&ep->name);
hash_set_mem (dm->cache_entry_by_name, ep->name, ep - dm->entries);
now = vlib_time_now (vm);
cname = vnet_dns_labels_to_name (rr->rdata, reply, &pos2);
/* Save the cname */
- vec_add1 (cname, 0);
- vec_dec_len (cname, 1);
+ dns_terminate_c_string (&cname);
ep = pool_elt_at_index (dm->entries, ep_index);
ep->cname = cname;
ep->flags |= (DNS_CACHE_ENTRY_FLAG_CNAME | DNS_CACHE_ENTRY_FLAG_VALID);
clib_memset (next_ep, 0, sizeof (*next_ep));
next_ep->name = vec_dup (cname);
- vec_add1 (next_ep->name, 0);
- vec_dec_len (next_ep->name, 1);
+ dns_terminate_c_string (&next_ep->name);
hash_set_mem (dm->cache_entry_by_name, next_ep->name,
next_ep - dm->entries);
dns_cache_entry_t *ep;
if (unformat (input, "%v", &name))
- {
- vec_add1 (name, 0);
- vec_dec_len (name, 1);
- }
+ dns_terminate_c_string (&name);
else
return clib_error_return (0, "no name provided");
label0 = (u8 *) (d0 + 1);
- /*
- * vnet_dns_labels_to_name produces a non NULL terminated vector
- * vnet_dns_resolve_name expects a C-string.
- */
name0 = vnet_dns_labels_to_name (label0, (u8 *) d0, (u8 **) & q0);
- vec_add1 (name0, 0);
- vec_dec_len (name0, 1);
t0->request_type = DNS_PEER_PENDING_NAME_TO_IP;
clib_memcpy_fast (t0->dst_address, ip40->src_address.as_u8,
sizeof (ip4_address_t));
+ /*
+ * vnet_dns_labels_to_name produces a non NULL terminated vector
+ * vnet_dns_resolve_name expects a C-string.
+ */
+ vec_add1 (name0, 0);
vnet_dns_resolve_name (vm, dm, name0, t0, &ep0);
if (ep0)