From 4dbd5e07adbcec8621d8f7c6a27f628cc7d33371 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Tue, 29 Jan 2013 23:29:34 +0100 Subject: [PATCH] Skip cidr checking for bans with negative or too large cidrlen. Upto some length, such bans could match the exact IP address. Obtained from: ircd-ratbox (androsyn) --- src/match.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/match.c b/src/match.c index c786ced1..29722c9c 100644 --- a/src/match.c +++ b/src/match.c @@ -436,12 +436,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 +453,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;