Fix buglet in yesterday's handling of "*" as an IP mask.
authorMichael Poole <mdpoole@troilus.org>
Tue, 8 Mar 2005 12:56:16 +0000 (12:56 +0000)
committerMichael Poole <mdpoole@troilus.org>
Tue, 8 Mar 2005 12:56:16 +0000 (12:56 +0000)
git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1326 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/match.c

index 5211f562640b8ead1552857c4ac09eb136fe9bc8..96ecbbb896b8fb1ce82e49399cf8d9f429edf236 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-08  Michael Poole <mdpoole@troilus.org>
+
+       * 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 <mdpoole@troilus.org>
 
        * configure.in: Consistently use a constant in AC_DEFINE().
index b1d0f74eb076b48bcdc519bbf4d3717f285fc21f..b653dcff7e6baf6de8852d8017d4de357fb08152 100644 (file)
@@ -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))