Thanks Jérôme,

CCing Baptiste for approval (in case we've missed anything, I'm clueless
about DNS).

Willy

On Sun, Jul 26, 2020 at 06:04:38PM +0200, Jerome Magnin wrote:
> Hi Tim,
> 
> On Sun, Jul 26, 2020 at 05:47:00PM +0200, Tim Düsterhus wrote:
> > Jerome,
> > 
> > Regarding the commit message: Please add backporting information to the
> > end of the commit message body (I believe it should be 2.2+).
> 
> You're right the commit I mentionned in the message was indeed
> introduced in 2.2-dev, so this must be backported to 2.2.
> > 
> > Regarding the patch:
> > 
> > +           /* skip 2 bytes for ttl */
> > +           reader += 4;
> > 
> > Either the commit or the code is incorrect here.
> The comment was wrong indeed. Thanks for your review.
> 
> -- 
> Jérôme

> >From 363ed1dd2f3ded7837bbb424eabb309803fc6292 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.
> ---
>  src/dns.c | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/src/dns.c b/src/dns.c
> index 6a8ab831c..7ea35ac11 100644
> --- a/src/dns.c
> +++ b/src/dns.c
> @@ -1044,6 +1044,33 @@ static int dns_validate_dns_response(unsigned char 
> *resp, unsigned char *bufend,
>       if (dns_query->type != DNS_RTYPE_SRV)
>               goto skip_parsing_additional_records;
>  
> +     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)
> -- 
> 2.27.0
> 


Reply via email to