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));