[Dnsmasq-discuss] [PATCH 2/2] Fix undefined behaviour in masks construction

Richard Genoud richard.genoud at gmail.com
Wed Sep 17 14:05:52 BST 2014


Left shifting int values is a undefined behaviour in C.
So we cast explicitly in in_addr_t (uint32_t) the value to be
shifted.

Signed-off-by: Richard Genoud <richard.genoud at gmail.com>
---
 src/auth.c    | 2 +-
 src/netlink.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/auth.c b/src/auth.c
index 066a9e449b83..dd46566ec2cc 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 cff43cc46b05..494d1a5413e8 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -208,7 +208,7 @@ 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;
 		    
-- 
2.0.0




More information about the Dnsmasq-discuss mailing list