Tidy up previous commit.
diff --git a/CHANGELOG b/CHANGELOG
index f59e7c5..5b7dfb8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,6 +14,12 @@
 	    Fix failure to build against Nettle-3.0. Thanks to Steven 
 	    Barth for spotting this and finding the fix. 
 	    
+	    When assigning existing DHCP leases to intefaces by comparing 
+	    networks, handle the case that two or more interfaces have the
+	    same network part, but different prefix lengths (favour the
+	    longer prefix length.) Thanks to Lung-Pin Chang for the 
+	    patch.
+	    
 
 version 2.71
             Subtle change to error handling to help DNSSEC validation 
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index 8e103d3..e70d10a 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -1247,7 +1247,6 @@
 #ifdef HAVE_DHCP
 void lease_update_file(time_t now);
 void lease_update_dns(int force);
-void lease_update_interface(time_t now);
 void lease_init(time_t now);
 struct dhcp_lease *lease4_allocate(struct in_addr addr);
 #ifdef HAVE_DHCP6
diff --git a/src/lease.c b/src/lease.c
index 9479afc..5d56b1b 100644
--- a/src/lease.c
+++ b/src/lease.c
@@ -352,20 +352,20 @@
 			     struct in_addr netmask, struct in_addr broadcast, void *vparam)
 {
   struct dhcp_lease *lease;
-  int prefix;
+  int prefix = netmask_length(netmask);
 
   (void) label;
   (void) broadcast;
   (void) vparam;
 
   for (lease = leases; lease; lease = lease->next)
-    if (!(lease->flags & (LEASE_TA | LEASE_NA))) {
-      prefix = netmask_length(netmask);
-      if (is_same_net(local, lease->addr, netmask) && prefix > lease->new_prefixlen) {
-        lease->new_interface = if_index;
+    if (!(lease->flags & (LEASE_TA | LEASE_NA)) &&
+	is_same_net(local, lease->addr, netmask) && 
+	prefix > lease->new_prefixlen) 
+      {
+	lease->new_interface = if_index;
         lease->new_prefixlen = prefix;
       }
-    }
 
   return 1;
 }
@@ -425,11 +425,19 @@
    start-time. */
 void lease_find_interfaces(time_t now)
 {
+  struct dhcp_lease *lease;
+  
+  for (lease = leases; lease; lease = lease->next)
+    lease->new_prefixlen = lease->new_interface = 0;
+
   iface_enumerate(AF_INET, &now, find_interface_v4);
 #ifdef HAVE_DHCP6
   iface_enumerate(AF_INET6, &now, find_interface_v6);
 #endif
-  lease_update_interface(now);
+
+  for (lease = leases; lease; lease = lease->next)
+    if (lease->new_interface != 0) 
+      lease_set_interface(lease, lease->new_interface, now);
 }
 
 #ifdef HAVE_DHCP6
@@ -504,16 +512,6 @@
     }
 }
 
-void lease_update_interface(time_t now)
-{
-  struct dhcp_lease *lease;
-
-  for (lease = leases; lease; lease = lease->next)
-    if (lease->new_interface > 0) {
-      lease_set_interface(lease, lease->new_interface, now);
-    }
-}
-
 void lease_prune(struct dhcp_lease *target, time_t now)
 {
   struct dhcp_lease *lease, *tmp, **up;
diff --git a/src/util.c b/src/util.c
index c1b0c50..660347f 100644
--- a/src/util.c
+++ b/src/util.c
@@ -323,11 +323,12 @@
 {
   int zero_count = 0;
 
-  while (0x0 == (mask.s_addr & 0x1)) {
-    mask.s_addr >>= 1;
-    ++zero_count;
-  }
-
+  while (0x0 == (mask.s_addr & 0x1) && zero_count < 32) 
+    {
+      mask.s_addr >>= 1;
+      zero_count++;
+    }
+  
   return 32 - zero_count;
 }