summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Genoud <richard.genoud@gmail.com>2014-09-17 21:17:39 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2014-09-17 21:17:39 +0100
commit10cfc0ddb35d8e7d19bdb86240a49004980b1ff8 (patch)
tree15d1b4bf31d09b19ee07f0d7f6a8912f7486db5c
parent15b1b7e9c330c2a746718c288550960450c01863 (diff)
downloaddnsmasq-10cfc0ddb35d8e7d19bdb86240a49004980b1ff8.tar.gz
Fix length->netmask conversions to avoid undefined behaviour.
-rw-r--r--src/auth.c2
-rw-r--r--src/netlink.c3
2 files changed, 3 insertions, 2 deletions
diff --git a/src/auth.c b/src/auth.c
index 066a9e4..dd46566 100644
--- a/src/auth.c
+++ b/src/auth.c
@@ -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;
diff --git a/src/netlink.c b/src/netlink.c
index cff43cc..b393283 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -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;