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:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user