]> jfr.im git - solanum.git/blobdiff - src/match.c
Spring cleaning redux:
[solanum.git] / src / match.c
index 18d7472f280bcf9505078db5b2e10e2134ce4cdc..d06b7420eb8c36e07f61d02d66309d2002123a4b 100644 (file)
@@ -24,6 +24,7 @@
 #include "client.h"
 #include "ircd.h"
 #include "match.h"
+#include "s_assert.h"
 
 /*
  * Compare if a given string (name) matches the given
@@ -187,7 +188,7 @@ int mask_match(const char *mask, const char *name)
  * is a number; '@' means match exactly one character that is a
  * letter; '\s' means match a space.
  *
- * This function supports escaping, so that a wildcard may be matched 
+ * This function supports escaping, so that a wildcard may be matched
  * exactly.
  *
  * @param[in] mask Wildcard-containing mask.
@@ -258,7 +259,8 @@ match_esc(const char *mask, const char *name)
                                return 1;
                        if(quote)
                                return 0;
-                       for(m--; (m > (const unsigned char *)mask) && (*m == '?'); m--);;
+                       for(m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
+                               ;
 
                        if(*m == '*' && (m > (const unsigned char *)mask))
                                return 1;
@@ -329,14 +331,14 @@ int comp_with_mask_sock(struct sockaddr *addr, struct sockaddr *dest, u_int mask
 
        if (addr->sa_family == AF_INET)
        {
-               iaddr = &((struct sockaddr_in *)addr)->sin_addr;
-               idest = &((struct sockaddr_in *)dest)->sin_addr;
+               iaddr = &((struct sockaddr_in *)(void *)addr)->sin_addr;
+               idest = &((struct sockaddr_in *)(void *)dest)->sin_addr;
        }
 #ifdef RB_IPV6
        else
        {
-               iaddr = &((struct sockaddr_in6 *)addr)->sin6_addr;
-               idest = &((struct sockaddr_in6 *)dest)->sin6_addr;
+               iaddr = &((struct sockaddr_in6 *)(void *)addr)->sin6_addr;
+               idest = &((struct sockaddr_in6 *)(void *)dest)->sin6_addr;
 
        }
 #endif
@@ -368,12 +370,15 @@ int match_ips(const char *s1, const char *s2)
        *len++ = '\0';
 
        cidrlen = atoi(len);
-       if (cidrlen == 0)
+       if (cidrlen <= 0)
                return 0;
 
 #ifdef RB_IPV6
        if (strchr(mask, ':') && strchr(address, ':'))
        {
+               if (cidrlen > 128)
+                       return 0;
+
                aftype = AF_INET6;
                ipptr = &((struct sockaddr_in6 *)&ipaddr)->sin6_addr;
                maskptr = &((struct sockaddr_in6 *)&maskaddr)->sin6_addr;
@@ -382,6 +387,9 @@ int match_ips(const char *s1, const char *s2)
 #endif
        if (!strchr(mask, ':') && !strchr(address, ':'))
        {
+               if (cidrlen > 32)
+                       return 0;
+
                aftype = AF_INET;
                ipptr = &((struct sockaddr_in *)&ipaddr)->sin_addr;
                maskptr = &((struct sockaddr_in *)&maskaddr)->sin_addr;
@@ -436,12 +444,15 @@ int match_cidr(const char *s1, const char *s2)
        *len++ = '\0';
 
        cidrlen = atoi(len);
-       if (cidrlen == 0)
+       if (cidrlen <= 0)
                return 0;
 
 #ifdef RB_IPV6
        if (strchr(ip, ':') && strchr(ipmask, ':'))
        {
+               if (cidrlen > 128)
+                       return 0;
+
                aftype = AF_INET6;
                ipptr = &((struct sockaddr_in6 *)&ipaddr)->sin6_addr;
                maskptr = &((struct sockaddr_in6 *)&maskaddr)->sin6_addr;
@@ -450,6 +461,9 @@ int match_cidr(const char *s1, const char *s2)
 #endif
        if (!strchr(ip, ':') && !strchr(ipmask, ':'))
        {
+               if (cidrlen > 32)
+                       return 0;
+
                aftype = AF_INET;
                ipptr = &((struct sockaddr_in *)&ipaddr)->sin_addr;
                maskptr = &((struct sockaddr_in *)&maskaddr)->sin_addr;
@@ -691,7 +705,7 @@ const unsigned int CharAttrs[] = {
 /* ! */ PRINT_C | KWILD_C | CHAN_C | NONEOS_C,
 /* " */ PRINT_C | CHAN_C | NONEOS_C,
 /* # */ PRINT_C | MWILD_C | CHANPFX_C | CHAN_C | NONEOS_C,
-/* $ */ PRINT_C | CHAN_C | NONEOS_C | USER_C,
+/* $ */ PRINT_C | CHAN_C | NONEOS_C,
 /* % */ PRINT_C | CHAN_C | NONEOS_C,
 /* & */ PRINT_C | CHANPFX_C | CHAN_C | NONEOS_C,
 /* ' */ PRINT_C | CHAN_C | NONEOS_C,