mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-04 13:48:30 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25e27235dd | ||
|
|
bf2db4b084 | ||
|
|
5782649ad9 | ||
|
|
288df49c96 | ||
|
|
10cfc0ddb3 | ||
|
|
15b1b7e9c3 | ||
|
|
00c0f69aa5 | ||
|
|
51943369e3 | ||
|
|
2d75f2e4a5 | ||
|
|
976afc93e4 | ||
|
|
7f68f82146 | ||
|
|
85900a246c | ||
|
|
b4f971a081 |
No files matched your search
@@ -27,14 +27,20 @@ version 2.72
|
||||
servers which loop back are disabled and this event is logged.
|
||||
Thanks to Smoothwall for their sponsorship of this feature.
|
||||
|
||||
Include an RFC4191 route information option in router
|
||||
advertisements for the prefix we're advertising. Thanks to
|
||||
Ilya Ponetaev for the patch.
|
||||
|
||||
Extend --conf-dir to allow filtering of files. So
|
||||
--conf-dir=/etc/dnsmasq.d,\*.conf
|
||||
will load all the files in /etc/dnsmasq.d which end in .conf
|
||||
|
||||
Fix bug when resulted in NXDOMAIN answers instead of NODATA in
|
||||
some circumstances.
|
||||
|
||||
Fix bug which caused dnsmasq to become unresponsive if it
|
||||
failed to send packets due to a network interface disappearing.
|
||||
Thanks to Niels Peen for spotting this.
|
||||
|
||||
Fix problem with --local-service option on big-endian platforms
|
||||
Thanks to Richard Genoud for the patch.
|
||||
|
||||
|
||||
version 2.71
|
||||
Subtle change to error handling to help DNSSEC validation
|
||||
|
||||
Vendored
+1
@@ -3,6 +3,7 @@ dnsmasq (2.72-1) unstable; urgency=low
|
||||
* New upstream.
|
||||
* If dns-root-data package is installed, use it to set the DNSSEC
|
||||
trust anchor(s). Recommend dns-root-data. (closes: #760460)
|
||||
* Handle AD bit correctly in replies from cache. (closes: #761654)
|
||||
|
||||
-- Simon Kelley <simon@thekelleys.org.uk> Tue, 20 May 2014 21:01:11 +0000
|
||||
|
||||
|
||||
+603
-448
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -31,7 +31,7 @@ static struct addrlist *find_subnet(struct auth_zone *zone, int flag, struct all
|
||||
if (!(flag & F_IPV4))
|
||||
continue;
|
||||
|
||||
netmask.s_addr = htonl(~((1 << (32 - subnet->prefixlen)) - 1));
|
||||
netmask.s_addr = htonl(~(in_addr_t)0 << (32 - subnet->prefixlen));
|
||||
|
||||
if (is_same_net(addr, subnet->addr.addr.addr4, netmask))
|
||||
return subnet;
|
||||
|
||||
+2
-2
@@ -636,7 +636,7 @@ struct crec *cache_find_by_name(struct crec *crecp, char *name, time_t now, unsi
|
||||
{
|
||||
if ((crecp->flags & F_FORWARD) &&
|
||||
#ifdef HAVE_DNSSEC
|
||||
((crecp->flags & (F_DNSKEY | F_DS)) == (prot & (F_DNSKEY | F_DS))) &&
|
||||
(((crecp->flags & (F_DNSKEY | F_DS)) == (prot & (F_DNSKEY | F_DS))) || (prot & F_NSIGMATCH)) &&
|
||||
#endif
|
||||
(crecp->flags & prot) &&
|
||||
hostname_isequal(cache_get_name(crecp), name))
|
||||
@@ -696,7 +696,7 @@ struct crec *cache_find_by_name(struct crec *crecp, char *name, time_t now, unsi
|
||||
if (ans &&
|
||||
(ans->flags & F_FORWARD) &&
|
||||
#ifdef HAVE_DNSSEC
|
||||
((ans->flags & (F_DNSKEY | F_DS)) == (prot & (F_DNSKEY | F_DS))) &&
|
||||
(((ans->flags & (F_DNSKEY | F_DS)) == (prot & (F_DNSKEY | F_DS))) || (prot & F_NSIGMATCH)) &&
|
||||
#endif
|
||||
(ans->flags & prot) &&
|
||||
hostname_isequal(cache_get_name(ans), name))
|
||||
|
||||
@@ -440,6 +440,7 @@ struct crec {
|
||||
#define F_SECSTAT (1u<<24)
|
||||
#define F_NO_RR (1u<<25)
|
||||
#define F_IPSET (1u<<26)
|
||||
#define F_NSIGMATCH (1u<<27)
|
||||
|
||||
/* Values of uid in crecs with F_CONFIG bit set. */
|
||||
#define SRC_INTERFACE 0
|
||||
|
||||
+2
-2
@@ -1118,7 +1118,7 @@ void receive_query(struct listener *listen, time_t now)
|
||||
struct in_addr netmask;
|
||||
for (addr = daemon->interface_addrs; addr; addr = addr->next)
|
||||
{
|
||||
netmask.s_addr = 0xffffffff << (32 - addr->prefixlen);
|
||||
netmask.s_addr = htonl(~(in_addr_t)0 << (32 - addr->prefixlen));
|
||||
if (!(addr->flags & ADDRLIST_IPV6) &&
|
||||
is_same_net(addr->addr.addr.addr4, source_addr.in.sin_addr, netmask))
|
||||
break;
|
||||
@@ -1652,7 +1652,7 @@ unsigned char *tcp_request(int confd, time_t now,
|
||||
struct in_addr netmask;
|
||||
for (addr = daemon->interface_addrs; addr; addr = addr->next)
|
||||
{
|
||||
netmask.s_addr = 0xffffffff << (32 - addr->prefixlen);
|
||||
netmask.s_addr = htonl(~(in_addr_t)0 << (32 - addr->prefixlen));
|
||||
if (!(addr->flags & ADDRLIST_IPV6) &&
|
||||
is_same_net(addr->addr.addr.addr4, peer_addr.in.sin_addr, netmask))
|
||||
break;
|
||||
|
||||
+2
-1
@@ -208,7 +208,8 @@ int iface_enumerate(int family, void *parm, int (*callback)())
|
||||
struct in_addr netmask, addr, broadcast;
|
||||
char *label = NULL;
|
||||
|
||||
netmask.s_addr = htonl(0xffffffff << (32 - ifa->ifa_prefixlen));
|
||||
netmask.s_addr = htonl(~(in_addr_t)0 << (32 - ifa->ifa_prefixlen));
|
||||
|
||||
addr.s_addr = 0;
|
||||
broadcast.s_addr = 0;
|
||||
|
||||
|
||||
-26
@@ -649,32 +649,6 @@ static int add_prefixes(struct in6_addr *local, int prefix,
|
||||
inet_ntop(AF_INET6, local, daemon->addrbuff, ADDRSTRLEN);
|
||||
if (!option_bool(OPT_QUIET_RA))
|
||||
my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s", param->if_name, daemon->addrbuff);
|
||||
|
||||
/* Send Route Information option (RFC4191, 2.3) */
|
||||
put_opt6_char(ICMP6_OPT_RT_INFO);
|
||||
/* Length in units of 8 octets will be 1 (header) +
|
||||
* 0, 1 or 2 (0...128 bits / 64 bit per unit) */
|
||||
if (0 == prefix)
|
||||
put_opt6_char(1);
|
||||
else if (prefix < 65)
|
||||
put_opt6_char(2);
|
||||
else
|
||||
put_opt6_char(3);
|
||||
|
||||
put_opt6_char(prefix);
|
||||
/* Same priority and advertised prefix */
|
||||
put_opt6_char(param->prio);
|
||||
/* "valid lifetime" seems more reasonable than "preferred" */
|
||||
put_opt6_long(valid);
|
||||
/* Actual prefix, only necessary part
|
||||
* Don't append any data in case of prefix length == 0 */
|
||||
if (0 != prefix)
|
||||
{
|
||||
if (prefix < 65)
|
||||
put_opt6((void *)local, 8);
|
||||
else
|
||||
put_opt6((void *)local, 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-1
@@ -1246,7 +1246,12 @@ int check_for_local_domain(char *name, time_t now)
|
||||
struct ptr_record *ptr;
|
||||
struct naptr *naptr;
|
||||
|
||||
if ((crecp = cache_find_by_name(NULL, name, now, F_IPV4 | F_IPV6 | F_CNAME | F_DS | F_NO_RR)) &&
|
||||
/* Note: the call to cache_find_by_name is intended to find any record which matches
|
||||
ie A, AAAA, CNAME, DS. Because RRSIG records are marked by setting both F_DS and F_DNSKEY,
|
||||
cache_find_by name ordinarily only returns records with an exact match on those bits (ie
|
||||
for the call below, only DS records). The F_NSIGMATCH bit changes this behaviour */
|
||||
|
||||
if ((crecp = cache_find_by_name(NULL, name, now, F_IPV4 | F_IPV6 | F_CNAME | F_DS | F_NO_RR | F_NSIGMATCH)) &&
|
||||
(crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG)))
|
||||
return 1;
|
||||
|
||||
|
||||
+16
-2
@@ -313,8 +313,8 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
||||
else if (msg_type != DHCP6IREQ)
|
||||
return 0;
|
||||
|
||||
/* server-id must match except for SOLICIT and CONFIRM messages */
|
||||
if (msg_type != DHCP6SOLICIT && msg_type != DHCP6CONFIRM && msg_type != DHCP6IREQ &&
|
||||
/* server-id must match except for SOLICIT, CONFIRM and REBIND messages */
|
||||
if (msg_type != DHCP6SOLICIT && msg_type != DHCP6CONFIRM && msg_type != DHCP6IREQ && msg_type != DHCP6REBIND &&
|
||||
(!(opt = opt6_find(state->packet_options, state->end, OPTION6_SERVER_ID, 1)) ||
|
||||
opt6_len(opt) != daemon->duid_len ||
|
||||
memcmp(opt6_ptr(opt, 0), daemon->duid, daemon->duid_len) != 0))
|
||||
@@ -328,6 +328,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
||||
(msg_type == DHCP6REQUEST || msg_type == DHCP6RENEW || msg_type == DHCP6RELEASE || msg_type == DHCP6DECLINE))
|
||||
|
||||
{
|
||||
*outmsgtypep = DHCP6REPLY;
|
||||
o1 = new_opt6(OPTION6_STATUS_CODE);
|
||||
put_opt6_short(DHCP6USEMULTI);
|
||||
put_opt6_string("Use multicast");
|
||||
@@ -1039,6 +1040,8 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
||||
|
||||
case DHCP6CONFIRM:
|
||||
{
|
||||
int good_addr = 0;
|
||||
|
||||
/* set reply message type */
|
||||
*outmsgtypep = DHCP6REPLY;
|
||||
|
||||
@@ -1063,9 +1066,14 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
||||
return 1;
|
||||
}
|
||||
|
||||
good_addr = 1;
|
||||
log6_quiet(state, "DHCPREPLY", req_addr, state->hostname);
|
||||
}
|
||||
}
|
||||
|
||||
/* No addresses, no reply: RFC 3315 18.2.2 */
|
||||
if (!good_addr)
|
||||
return 0;
|
||||
|
||||
o1 = new_opt6(OPTION6_STATUS_CODE);
|
||||
put_opt6_short(DHCP6SUCCESS );
|
||||
@@ -1232,6 +1240,12 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* We must anwser with 'success' in global section anyway */
|
||||
o1 = new_opt6(OPTION6_STATUS_CODE);
|
||||
put_opt6_short(DHCP6SUCCESS);
|
||||
put_opt6_string(_("success"));
|
||||
end_opt6(o1);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+13
-3
@@ -570,18 +570,28 @@ void bump_maxfd(int fd, int *max)
|
||||
|
||||
int retry_send(void)
|
||||
{
|
||||
struct timespec waiter;
|
||||
/* Linux kernels can return EAGAIN in perpetuity when calling
|
||||
sendmsg() and the relevant interface has gone. Here we loop
|
||||
retrying in EAGAIN for 1 second max, to avoid this hanging
|
||||
dnsmasq. */
|
||||
|
||||
static int retries = 0;
|
||||
struct timespec waiter;
|
||||
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
{
|
||||
waiter.tv_sec = 0;
|
||||
waiter.tv_nsec = 10000;
|
||||
nanosleep(&waiter, NULL);
|
||||
return 1;
|
||||
if (retries++ < 1000)
|
||||
return 1;
|
||||
}
|
||||
|
||||
retries = 0;
|
||||
|
||||
if (errno == EINTR)
|
||||
return 1;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user