diff --git a/src/dns/client.c b/src/dns/client.c index ad9c85c7f..8b5d78863 100644 --- a/src/dns/client.c +++ b/src/dns/client.c @@ -914,33 +914,53 @@ static void getaddrinfo_h(int err, void *arg) tmr_start(&q->tmr_ttl, GETADDRINFO_TTL * 1000, ttl_timeout_handler, q); out: - mem_deref(dq->name); mem_deref(dq); } +static void dq_deref(void *arg) +{ + struct dnsquery *dq = arg; + + mem_deref(dq->dnsc); + mem_deref(dq->name); +} + + static int query_getaddrinfo(struct dns_query *q) { int err; - struct dnsquery *dq = mem_zalloc(sizeof(struct dnsquery), NULL); + struct dnsquery *dq = mem_zalloc(sizeof(struct dnsquery), dq_deref); if (!dq) return ENOMEM; - str_dup(&dq->name, q->name); + err = str_dup(&dq->name, q->name); + if (err) + goto out; + dq->type = q->type; dq->hdr.id = q->id; dq->hdr.opcode = q->opcode; dq->dnsclass = q->dnsclass; - dq->dnsc = q->dnsc; + dq->dnsc = mem_ref(q->dnsc); dq->rrlv = mem_alloc(sizeof(struct list), NULL); + if (!dq->rrlv) { + err = ENOMEM; + goto out; + } + list_init(dq->rrlv); err = re_thread_async(async_getaddrinfo, getaddrinfo_h, dq); if (err) DEBUG_WARNING("re_thread_async: %m\n", err); +out: + if (err) + mem_deref(dq); + return err; }