Committer  : entrope
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Commit time: 2005-03-08 12:56:26 UTC

Modified files:
     ChangeLog ircd/match.c

Log message:

Fix buglet in yesterday's handling of "*" as an IP mask.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.562 ircu2.10/ChangeLog:1.563
--- ircu2.10/ChangeLog:1.562    Mon Mar  7 13:11:49 2005
+++ ircu2.10/ChangeLog  Tue Mar  8 04:56:14 2005
@@ -1,3 +1,9 @@
+2005-03-08  Michael Poole <[EMAIL PROTECTED]>
+
+       * 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 <[EMAIL PROTECTED]>
 
        * configure.in: Consistently use a constant in AC_DEFINE().
Index: ircu2.10/ircd/match.c
diff -u ircu2.10/ircd/match.c:1.13 ircu2.10/ircd/match.c:1.14
--- ircu2.10/ircd/match.c:1.13  Mon Mar  7 13:12:37 2005
+++ ircu2.10/ircd/match.c       Tue Mar  8 04:56:16 2005
@@ -18,7 +18,7 @@
  */
 /** @file
  * @brief Functions to match strings against IRC mask strings.
- * @version $Id: match.c,v 1.13 2005/03/07 21:12:37 entrope Exp $
+ * @version $Id: match.c,v 1.14 2005/03/08 12:56:16 entrope Exp $
  */
 #include "config.h"
 
@@ -907,6 +907,8 @@
     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 @@
 
   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))
----------------------- End of diff -----------------------

Reply via email to