]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MAJOR: dns: don't treat Authority records as an error
authorJerome Magnin <jerome@layaute.net>
Sun, 26 Jul 2020 10:13:12 +0000 (12:13 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 29 Jul 2020 10:06:59 +0000 (12:06 +0200)
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

index 6a8ab831c392c557d4c67f248ce8d22aa71e061a..f5bce4261497b041186d44879f0de1a0214bd3ad 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -1044,6 +1044,34 @@ static int dns_validate_dns_response(unsigned char *resp, unsigned char *bufend,
        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++) {
                if (reader >= bufend)