53 lines
2.0 KiB
Diff
53 lines
2.0 KiB
Diff
From 7a9d6fd9b6564b0bf54b62cb05242964a9763f9e Mon Sep 17 00:00:00 2001
|
|
From: James Coglan <james@neighbourhood.ie>
|
|
Date: Fri, 28 Jun 2024 13:58:22 +0100
|
|
Subject: [PATCH] resolved: correct parsing of OPT extended RCODEs
|
|
|
|
The DNS_PACKET_RCODE() function works out the full RCODE by taking the
|
|
first octet from the OPT record TTL field and bitwise-OR-ing this with
|
|
the basic RCODE from the packet header. This results in RCODE values
|
|
being lower than they should be.
|
|
|
|
For example, if the first TTL octet is 0x7a and the basic RCODE is 3,
|
|
this function currently returns `0x7a | 3` = 123, rather than 0x7a3 =
|
|
1955.
|
|
|
|
The first TTL octet is supposed to form the upper 8 bits of a 12-bit
|
|
value, whereas the current implementation constraints the value to 8
|
|
bits and results in mis-interpreted RCODEs.
|
|
|
|
This fixes things by shifting the TTL 20 places instead of 24 and
|
|
masking off the low nibble that comes from the upper bits of the version
|
|
octet.
|
|
|
|
Note that dns_packet_append_opt() correctly converts the input RCODE
|
|
into the high octet of the OPT TTL field; this problem only affects
|
|
parsing of incoming packets.
|
|
|
|
(cherry picked from commit c40f3714c9a4d1f2bcd308625c9c835892e3d41c)
|
|
(cherry picked from commit 7ee60a86140ebe3e60858ef3c4e749dcd2e7fd21)
|
|
(cherry picked from commit c572f1ed2b7565263007b26a10872fb047526d73)
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/systemd/systemd-stable/commit/7a9d6fd9b6564b0bf54b62cb05242964a9763f9e
|
|
---
|
|
src/resolve/resolved-dns-packet.h | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/src/resolve/resolved-dns-packet.h b/src/resolve/resolved-dns-packet.h
|
|
index a6af44c6ec..5a5ef13c8d 100644
|
|
--- a/src/resolve/resolved-dns-packet.h
|
|
+++ b/src/resolve/resolved-dns-packet.h
|
|
@@ -117,7 +117,7 @@ static inline uint16_t DNS_PACKET_RCODE(DnsPacket *p) {
|
|
uint16_t rcode;
|
|
|
|
if (p->opt)
|
|
- rcode = (uint16_t) (p->opt->ttl >> 24);
|
|
+ rcode = (uint16_t) ((p->opt->ttl >> 20) & 0xFF0);
|
|
else
|
|
rcode = 0;
|
|
|
|
--
|
|
2.33.0
|
|
|