From fea9a644323b70ac697a8b277520c5ad99403c01 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Fri, 10 Jul 2026 17:51:53 +0100 Subject: [PATCH] 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 23b298bce75a0d1f4f15f34458af9678b4a30c3a --- src/resolve/resolved-dns-query.c | 5 +++++ src/resolve/test-dns-query.c | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index 6ec6569ae7..1498b0e3b7 100644 --- a/src/resolve/resolved-dns-query.c +++ b/src/resolve/resolved-dns-query.c @@ -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 diff --git a/src/resolve/test-dns-query.c b/src/resolve/test-dns-query.c index 9c1e2a73a5..e53d38c94a 100644 --- a/src/resolve/test-dns-query.c +++ b/src/resolve/test-dns-query.c @@ -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));