summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Genoud <richard.genoud@gmail.com>2014-09-17 21:12:00 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2014-09-17 21:12:00 +0100
commit15b1b7e9c330c2a746718c288550960450c01863 (patch)
treeef0a4d08892719cfbae232e268f114da08412b7a
parent00c0f69aa5adabf95bc9b5012f039f1adbb023a9 (diff)
downloaddnsmasq-15b1b7e9c330c2a746718c288550960450c01863.tar.gz
Fix endian bug in --local-service code.
-rw-r--r--CHANGELOG3
-rw-r--r--src/forward.c4
2 files changed, 5 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 1146413..a499107 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -49,6 +49,9 @@ version 2.71
regression introduced in 2.69. Thanks to James Hunt and
the Ubuntu crowd for assistance in fixing this.
+ Fix problem with --local-service option on big-endian platforms
+ Thanks to Richard Genoud for the patch.
+
version 2.70
Fix crash, introduced in 2.69, on TCP request when dnsmasq
diff --git a/src/forward.c b/src/forward.c
index 3afd1b1..4895efe 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -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;