Hi, On Sun, Jul 26, 2020 at 10:41:18PM +0200, Willy Tarreau wrote: > Thanks Jérôme, > > CCing Baptiste for approval (in case we've missed anything, I'm clueless > about DNS). >
Baptiste just reviewed my patch, made a couple suggestions, so please find an update attached to this email.
>From db0198a29ab493796414033b8fb11661e91d0bee Mon Sep 17 00:00:00 2001 From: Jerome Magnin <jer...@layaute.net> Date: Sun, 26 Jul 2020 12:13:12 +0200 Subject: [PATCH] BUG/MAJOR: dns: don't treat Authority records as an error Support for DNS Service Discovery by means of SRV records was enhanced with commit 13a9232eb ("MEDIUM: dns: use Additional records from SRV responses") to use the content of the answers Additional records when present. If there are Authority records before the Additional records we mistakenly treat that as an invalid response. To fix this, just ignore the Authority section if it exist and skip to the Additional records. As 13a9232eb was introduced during 2.2-dev, it must be backported to 2.2. This is a fix for issue #778 --- src/dns.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/dns.c b/src/dns.c index 6a8ab831c..613d7308f 100644 --- a/src/dns.c +++ b/src/dns.c @@ -1043,6 +1043,35 @@ static int dns_validate_dns_response(unsigned char *resp, unsigned char *bufend, /* now parsing additional records for SRV queries only */ if (dns_query->type != DNS_RTYPE_SRV) goto skip_parsing_additional_records; + + /* if we find Authority records, just skip them */ + for (i = 0; i < dns_p->header.nscount; i++) { + offset = 0; + len = dns_read_name(resp, bufend, reader, tmpname, DNS_MAX_NAME_SIZE, + &offset, 0); + if (len == 0) + continue; + + + if (reader + offset + 10 >= bufend) + goto invalid_resp; + + reader += offset; + /* skip 2 bytes for class */ + reader += 2; + /* skip 2 bytes for type */ + reader += 2; + /* skip 4 bytes for ttl */ + reader += 4; + /* read data len */ + len = reader[0] * 256 + reader[1]; + reader += 2; + + if (reader + len >= bufend) + goto invalid_resp; + + reader += len; + } nb_saved_records = 0; for (i = 0; i < dns_p->header.arcount; i++) { -- 2.27.0