chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
resolved: DNSKEY records
[elogind.git]
/
src
/
resolve
/
resolved-dns-scope.c
diff --git
a/src/resolve/resolved-dns-scope.c
b/src/resolve/resolved-dns-scope.c
index 291d0356be83011cac7ad940e2847d9ad7a3d8cb..0f654a6102bf2efff85de7670d068e43bd34f9ed 100644
(file)
--- 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;
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;
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 (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
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);
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);
return -EINVAL;
r = dns_packet_new(&p, s->protocol, 0);