resolved: preserve unchanged question on asymmetric redirect

dns_question_cname_redirect() returns no replacement when a question
already matches a CNAME target or a DNAME does not apply. If only one of
the UTF-8 and IDNA questions redirects, dns_query_cname_redirect() then
installs NULL for the unchanged side.

Keep a reference to the original question on whichever side does not
redirect, and update the existing asymmetric DNAME test to verify it.

Follow-up for 23b298bce7
This commit is contained in:
Luca Boccassi
2026-07-15 21:13:24 +01:00
parent 14830891f3
commit fea9a64432
2 changed files with 11 additions and 1 deletions
+5
View File
@@ -1339,6 +1339,11 @@ static int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname)
if (r == 0 && k == 0) /* No actual cname happened? */
return -ELOOP;
if (r == 0)
nq_idna = dns_question_ref(q->question_idna);
if (k == 0)
nq_utf8 = dns_question_ref(q->question_utf8);
if (q->answer_protocol == DNS_PROTOCOL_DNS)
/* Don't permit CNAME redirects from unicast DNS to LLMNR or MulticastDNS, so that global resources
* cannot invade the local namespace. The opposite way we permit: local names may redirect to global
+6 -1
View File
@@ -522,7 +522,7 @@ TEST(dns_query_process_cname_one_success_match_dname_utf8_different) {
ASSERT_EQ(query->n_cname_redirects, 1u);
ASSERT_EQ(dns_question_size(query->collected_questions), 2u);
ASSERT_NULL(query->question_utf8);
ASSERT_EQ(dns_question_size(query->question_utf8), 1u);
ASSERT_EQ(dns_question_size(query->question_idna), 1u);
key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.\xF0\x9F\x98\xB1.com");
@@ -535,6 +535,11 @@ TEST(dns_query_process_cname_one_success_match_dname_utf8_different) {
ASSERT_TRUE(dns_question_contains_key(query->collected_questions, key));
dns_resource_key_unref(key);
key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.\xF0\x9F\x98\xB1.com");
ASSERT_NOT_NULL(key);
ASSERT_TRUE(dns_question_contains_key(query->question_utf8, key));
dns_resource_key_unref(key);
key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.v2.xn--tl8h.com");
ASSERT_NOT_NULL(key);
ASSERT_TRUE(dns_question_contains_key(query->question_idna, key));