From e81b4db58defa6bd58e3a4c33a1393989156b439 Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 1 Jun 2014 23:19:03 +0000 Subject: - 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 --- src/hostmask.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src') 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 } -- cgit