X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-scope.c;h=0f654a6102bf2efff85de7670d068e43bd34f9ed;hb=23432a1c249b9c513e438bffe9778a7ce2ee74fe;hp=42a2fc4c774c3fbc923acc6f8075626c3901d703;hpb=4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4;p=elogind.git diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 42a2fc4c7..0f654a610 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -85,7 +85,7 @@ DnsScope* dns_scope_free(DnsScope *s) { return NULL; } -DnsServer *dns_scope_get_server(DnsScope *s) { +DnsServer *dns_scope_get_dns_server(DnsScope *s) { assert(s); if (s->protocol != DNS_PROTOCOL_DNS) @@ -133,7 +133,7 @@ int dns_scope_send(DnsScope *s, DnsPacket *p) { if (DNS_PACKET_QDCOUNT(p) > 1) return -ENOTSUP; - srv = dns_scope_get_server(s); + srv = dns_scope_get_dns_server(s); if (!srv) return -ESRCH; @@ -197,7 +197,7 @@ int dns_scope_tcp_socket(DnsScope *s, int family, const union in_addr_union *add if (family == AF_UNSPEC) { DnsServer *srv; - srv = dns_scope_get_server(s); + srv = dns_scope_get_dns_server(s); if (!srv) return -ESRCH; @@ -353,6 +353,12 @@ int dns_scope_llmnr_membership(DnsScope *s, bool b) { if (fd < 0) return fd; + /* Always first try to drop membership before we add + * one. This is necessary on some devices, such as + * veth. */ + if (b) + setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn)); + if (setsockopt(fd, IPPROTO_IP, b ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0) return -errno; @@ -366,6 +372,9 @@ int dns_scope_llmnr_membership(DnsScope *s, bool b) { if (fd < 0) return fd; + if (b) + setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); + if (setsockopt(fd, IPPROTO_IPV6, b ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) return -errno; } else @@ -384,7 +393,7 @@ int dns_scope_good_dns_server(DnsScope *s, int family, const union in_addr_union if (s->link) return !!link_find_dns_server(s->link, family, address); else - return manager_known_dns_server(s->manager, family, address); + return !!manager_find_dns_server(s->manager, family, address); } static int dns_scope_make_reply_packet( @@ -403,7 +412,9 @@ static int dns_scope_make_reply_packet( assert(s); - if (q->n_keys <= 0 && answer->n_rrs <= 0 && soa->n_rrs <= 0) + if ((!q || q->n_keys <= 0) + && (!answer || answer->n_rrs <= 0) + && (!soa || soa->n_rrs <= 0)) return -EINVAL; r = dns_packet_new(&p, s->protocol, 0);