X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/f2edb2be59be9e73505fec2b30c7e48ef54fd3d2..29c92cf95f9b9e669b08e90d13c8a8ba12369d58:/src/match.c diff --git a/src/match.c b/src/match.c index c786ced1..d06b7420 100644 --- a/src/match.c +++ b/src/match.c @@ -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;