Update IP glob matching to work more accurately with IPv6.
authorMichael Poole <mdpoole@troilus.org>
Mon, 22 Nov 2010 12:33:45 +0000 (07:33 -0500)
committerMichael Poole <mdpoole@troilus.org>
Mon, 22 Nov 2010 12:33:45 +0000 (07:33 -0500)
When given an IP like 2001::1234:5678:1:2:3:4, srvx (properly) makes
a glob like 2001:0:4137:*.  However, it wouldn't realize that the
glob actually matches the IP, because it used string glob matching.

src/tools.c (user_matches_glob): Use a parsed glob to match against
  the user's IP address.

src/tools.c

index 7ba3738e27c85b37f9858d92581250428b90e5ab..b10bc7be4379b5b573008142c58bb539ffe9c9c3 100644 (file)
@@ -591,7 +591,9 @@ extern const char *hidden_host_suffix;
 int
 user_matches_glob(struct userNode *user, const char *orig_glob, int flags)
 {
+    irc_in_addr_t mask;
     char *glob, *marker;
+    unsigned char mask_bits;
 
     /* Make a writable copy of the glob */
     glob = alloca(strlen(orig_glob)+1);
@@ -631,8 +633,8 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags)
         && (IsFakeHost(user) || (hidden_host_suffix && user->handle_info)))
         return 0;
     /* If it might be an IP glob, test that. */
-    if (!glob[strspn(glob, "0123456789./*?")]
-        && match_ircglob(irc_ntoa(&user->ip), glob))
+    if (irc_pton(&mask, &mask_bits, glob)
+        && irc_check_mask(&user->ip, &mask, mask_bits))
         return 1;
     /* None of the above; could only be a hostname match. */
     return match_ircglob(user->hostname, glob);