X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-scope.c;h=0f654a6102bf2efff85de7670d068e43bd34f9ed;hb=bd8f65387673e29f46136a4ed172097035002c23;hp=291d0356be83011cac7ad940e2847d9ad7a3d8cb;hpb=2c27fbca2d88214bd305272308a370a962818f1e;p=elogind.git diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 291d0356b..0f654a610 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -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 @@ -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);