]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: refuse OPT RRs in incoming packets that are not in the additional section
authorLennart Poettering <lennart@poettering.net>
Thu, 10 Dec 2015 12:46:53 +0000 (13:46 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 11 Dec 2015 13:14:27 +0000 (14:14 +0100)
We later rely that the DnsAnswer object contains all RRs from the
original packet, at least when it comes to the answer and authorization
sections, hence we better make sure we don#t silently end up removing an
OPT RR from these two sections.

src/resolve/resolved-dns-packet.c

index 2117b7097902e82f7ebea0fe9ecbfd9eb510df85..7c5be538b8f8e089e6f0d8a64dcdebc2128f49d8 100644 (file)
@@ -1993,8 +1993,18 @@ int dns_packet_extract(DnsPacket *p) {
                                 goto finish;
 
                         if (rr->key->type == DNS_TYPE_OPT) {
-                                if (p->opt)
-                                        return -EBADMSG;
+
+                                /* The OPT RR is only valid in the Additional section */
+                                if (i < DNS_PACKET_ANCOUNT(p) + DNS_PACKET_NSCOUNT(p)) {
+                                        r = -EBADMSG;
+                                        goto finish;
+                                }
+
+                                /* Two OPT RRs? */
+                                if (p->opt) {
+                                        r = -EBADMSG;
+                                        goto finish;
+                                }
 
                                 p->opt = dns_resource_record_ref(rr);
                         } else {