X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-scope.c;h=96a2ff7fae0fcdbae47af863dbd4775994423e31;hp=38b64905a4565827724583d8c4284ec2771b781d;hb=7e8e0422aeb16f2a09a40546c61df753d10029b6;hpb=0dd25fb9f005d8ab7ac4bc10a609d00569f8c56a diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 38b64905a..96a2ff7fa 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -23,6 +23,7 @@ #include "strv.h" #include "socket-util.h" +#include "af-list.h" #include "resolved-dns-domain.h" #include "resolved-dns-scope.h" @@ -47,27 +48,32 @@ int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol protocol, int dns_scope_llmnr_membership(s, true); - log_debug("New scope on link %s, protocol %s, family %s", strna(l ? l->name : NULL), dns_protocol_to_string(protocol), family_to_string(family)); + log_debug("New scope on link %s, protocol %s, family %s", l ? l->name : "*", dns_protocol_to_string(protocol), family == AF_UNSPEC ? "*" : af_to_name(family)); *ret = s; return 0; } DnsScope* dns_scope_free(DnsScope *s) { + DnsQueryTransaction *t; + if (!s) return NULL; - log_debug("Removing scope on link %s, protocol %s, family %s", strna(s->link ? s->link->name : NULL), dns_protocol_to_string(s->protocol), family_to_string(s->family)); + log_debug("Removing scope on link %s, protocol %s, family %s", s->link ? s->link->name : "*", dns_protocol_to_string(s->protocol), s->family == AF_UNSPEC ? "*" : af_to_name(s->family)); dns_scope_llmnr_membership(s, false); - while (s->transactions) { - DnsQuery *q; + while ((t = s->transactions)) { + + /* Abort the transaction, but make sure it is not + * freed while we still look at it */ - q = s->transactions->query; - dns_query_transaction_free(s->transactions); + t->block_gc++; + dns_query_transaction_complete(t, DNS_QUERY_ABORTED); + t->block_gc--; - dns_query_finish(q); + dns_query_transaction_free(t); } dns_cache_flush(&s->cache); @@ -181,7 +187,7 @@ int dns_scope_tcp_socket(DnsScope *s) { _cleanup_close_ int fd = -1; union sockaddr_union sa = {}; socklen_t salen; - int one, ifindex, ret; + int one, ret; DnsServer *srv; int r; @@ -191,9 +197,6 @@ int dns_scope_tcp_socket(DnsScope *s) { if (!srv) return -ESRCH; - if (s->link) - ifindex = s->link->ifindex; - sa.sa.sa_family = srv->family; if (srv->family == AF_INET) { sa.in.sin_port = htobe16(53); @@ -202,7 +205,7 @@ int dns_scope_tcp_socket(DnsScope *s) { } else if (srv->family == AF_INET6) { sa.in6.sin6_port = htobe16(53); sa.in6.sin6_addr = srv->address.in6; - sa.in6.sin6_scope_id = ifindex; + sa.in6.sin6_scope_id = s->link ? s->link->ifindex : 0; salen = sizeof(sa.in6); } else return -EAFNOSUPPORT; @@ -230,37 +233,37 @@ DnsScopeMatch dns_scope_good_domain(DnsScope *s, const char *domain) { assert(domain); STRV_FOREACH(i, s->domains) - if (dns_name_endswith(domain, *i)) + if (dns_name_endswith(domain, *i) > 0) return DNS_SCOPE_YES; - if (dns_name_root(domain)) + if (dns_name_root(domain) != 0) return DNS_SCOPE_NO; if (is_localhost(domain)) return DNS_SCOPE_NO; if (s->protocol == DNS_PROTOCOL_DNS) { - if (dns_name_endswith(domain, "254.169.in-addr.arpa") || - dns_name_endswith(domain, "0.8.e.f.ip6.arpa") || - dns_name_single_label(domain)) - return DNS_SCOPE_NO; + if (dns_name_endswith(domain, "254.169.in-addr.arpa") == 0 && + dns_name_endswith(domain, "0.8.e.f.ip6.arpa") == 0 && + dns_name_single_label(domain) == 0) + return DNS_SCOPE_MAYBE; - return DNS_SCOPE_MAYBE; + return DNS_SCOPE_NO; } if (s->protocol == DNS_PROTOCOL_MDNS) { - if (dns_name_endswith(domain, "254.169.in-addr.arpa") || - dns_name_endswith(domain, "0.8.e.f.ip6.arpa") || - dns_name_endswith(domain, "local")) + if (dns_name_endswith(domain, "254.169.in-addr.arpa") > 0 || + dns_name_endswith(domain, "0.8.e.f.ip6.arpa") > 0 || + (dns_name_endswith(domain, "local") > 0 && dns_name_equal(domain, "local") == 0)) return DNS_SCOPE_MAYBE; return DNS_SCOPE_NO; } if (s->protocol == DNS_PROTOCOL_LLMNR) { - if (dns_name_endswith(domain, "254.169.in-addr.arpa") || - dns_name_endswith(domain, "0.8.e.f.ip6.arpa") || - dns_name_single_label(domain)) + if (dns_name_endswith(domain, "254.169.in-addr.arpa") > 0 || + dns_name_endswith(domain, "0.8.e.f.ip6.arpa") > 0 || + dns_name_single_label(domain) > 0) return DNS_SCOPE_MAYBE; return DNS_SCOPE_NO;