From acd264b435b769b9658c439d92019b7a0a23e2fe Mon Sep 17 00:00:00 2001 From: Erik Ekman Date: Mon, 21 Sep 2009 20:35:18 +0000 Subject: [PATCH] Make sure replies with errors get the name parsed --- src/dns.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/dns.c b/src/dns.c index 4a66a2b..e1704c9 100644 --- a/src/dns.c +++ b/src/dns.c @@ -302,14 +302,15 @@ dns_decode(char *buf, size_t buflen, struct query *q, qr_t qr, char *packet, siz switch (qr) { case QR_ANSWER: - if(qdcount < 1 || ancount < 1) { - /* We may get both CNAME and A, then ancount=2 */ + if(qdcount < 1) { + /* We need a question */ return -1; } if (q != NULL) q->id = id; + /* Read name even if no answer, to give better error message */ readname(packet, packetlen, &data, name, sizeof(name)); CHECKLEN(4); readshort(packet, &data, &type); @@ -320,6 +321,11 @@ dns_decode(char *buf, size_t buflen, struct query *q, qr_t qr, char *packet, siz /* We only need the first char to check it */ q->name[0] = name[0]; q->name[1] = '\0'; + } + + if (ancount < 1) { + /* We may get both CNAME and A, then ancount=2 */ + return -1; } /* Assume that first answer is NULL/CNAME that we wanted */