]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: preserve unchanged question on asymmetric redirect
authorLuca Boccassi <luca.boccassi@gmail.com>
Fri, 10 Jul 2026 16:51:53 +0000 (17:51 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Wed, 15 Jul 2026 20:13:24 +0000 (21:13 +0100)
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
src/resolve/test-dns-query.c

index 6ec6569ae7639741a840616815c71f6acbf5d06f..1498b0e3b763719204e301767f6b6b9a4f74d07a 100644 (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
index 9c1e2a73a55a9ec3a7b5c893db7d626f5a6515a3..e53d38c94a9cd8c280a9bce81576beae0ac29cdd 100644 (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));