From 438c3e8d8e3392b3c618523e90a5bf6bdbd2b35e Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Tue, 8 Mar 2005 12:56:16 +0000 Subject: [PATCH] Fix buglet in yesterday's handling of "*" as an IP mask. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1326 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 6 ++++++ ircd/match.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 5211f56..96ecbbb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-03-08 Michael Poole + + * ircd/match.c (ipmask_parse): Explicitly zero-initialize the mask + and bit count for "*". + (ipmask_check): Make more robust to similar errors. + 2005-03-07 Michael Poole * configure.in: Consistently use a constant in AC_DEFINE(). diff --git a/ircd/match.c b/ircd/match.c index b1d0f74..b653dcf 100644 --- a/ircd/match.c +++ b/ircd/match.c @@ -907,6 +907,8 @@ int ipmask_parse(const char *in, struct irc_in_addr *mask, unsigned char *bits_p bits += 96; } else if (in[0] == '*' && in[1] == '\0') { /* accept as a 0-bit mask */ + memset(&mask->in6_16, 0, sizeof(mask->in6_16)); + bits = 0; } else { if (!(p = strchr(in, '/'))) bits = 128; @@ -941,7 +943,7 @@ int ipmask_check(const struct irc_in_addr *addr, const struct irc_in_addr *mask, for (k = 0; k < 8; k++) { if (bits < 16) - return (addr->in6_16[k] & htons(0xffff << (16-bits))) == mask->in6_16[k]; + return !(htons(addr->in6_16[k] ^ mask->in6_16[k]) >> (16-bits)); if (addr->in6_16[k] != mask->in6_16[k]) return 0; if (!(bits -= 16)) -- 2.20.1