summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2014-06-01 23:19:03 +0000
committermichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2014-06-01 23:19:03 +0000
commite81b4db58defa6bd58e3a4c33a1393989156b439 (patch)
treea370e5fbdaf158452071d13b32ed31f586c21e26 /src
parent4b5af70dd3568a23ee1c638865ffde114e0945f4 (diff)
- hostmask.c:mask_addr(): fixed merging error
git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/branches/8.1.x@3772 82007160-df01-0410-b94d-b575c5fd34c7
Diffstat (limited to 'src')
-rw-r--r--src/hostmask.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/hostmask.c b/src/hostmask.c
index c82a88c..5d29109 100644
--- a/src/hostmask.c
+++ b/src/hostmask.c
@@ -327,20 +327,25 @@ mask_addr(struct irc_ssaddr *ip, int bits)
if (ip->ss.ss_family != AF_INET6)
#endif
{
+ uint32_t tmp = 0;
v4_base_ip = (struct sockaddr_in *)ip;
mask = ~((1 << (32 - bits)) - 1);
- v4_base_ip->sin_addr.s_addr = htonl(ntohl(v4_base_ip->sin_addr.s_addr) & mask);
+ tmp = ntohl(v4_base_ip->sin_addr.s_addr);
+ v4_base_ip->sin_addr.s_addr = htonl(tmp & mask);
}
#ifdef IPV6
else
{
- uint32_t tmp = 0;
- v4_base_ip = (struct sockaddr_in *)ip;
+ n = bits / 8;
+ m = bits % 8;
+ v6_base_ip = (struct sockaddr_in6 *)ip;
- mask = ~((1 << (32 - bits)) - 1);
- tmp = ntohl(v4_base_ip->sin_addr.s_addr);
- v4_base_ip->sin_addr.s_addr = htonl(tmp & mask);
+ mask = ~((1 << (8 - m)) -1 );
+ v6_base_ip->sin6_addr.s6_addr[n] = v6_base_ip->sin6_addr.s6_addr[n] & mask;
+
+ for (i = n + 1; i < 16; i++)
+ v6_base_ip->sin6_addr.s6_addr[i] = 0;
}
#endif
}