]> jfr.im git - irc/atheme/atheme.git/commitdiff
Check IP/mask validity in CLONES ADDEXEMPT
authorRenegade334 <redacted>
Tue, 16 Dec 2014 14:38:05 +0000 (14:38 +0000)
committerRenegade334 <redacted>
Tue, 16 Dec 2014 14:40:56 +0000 (14:40 +0000)
include/tools.h
libathemecore/cidr.c
modules/operserv/clones.c

index a4edc293486a7bfd772a5278a2a7b8456ca8562a..dada3b2b6e3be33cfa43ddeae7e0235a7119dc30 100644 (file)
@@ -27,6 +27,9 @@ E void arc4random_addrandom(unsigned char *dat, int datlen);
 E unsigned int arc4random(void);
 #endif /* !HAVE_ARC4RANDOM */
 
+/* cidr.c */
+E int valid_ip_or_mask(const char *src);
+
 typedef enum {
        LOG_ANY = 0,
        LOG_INTERACTIVE = 1, /* IRC channels */
index 0b3abb88de7eba29df1d23b1e2fa1660e6c1679d..9702d366c8b67a9de142fdba380639b3041784c6 100644 (file)
@@ -368,6 +368,52 @@ match_cidr(const char *s1, const char *s2)
                return 1;
 }
 
+int valid_ip_or_mask(const char *src)
+{
+       char ipaddr[IN6ADDRSZ], buf[IN6ADDRSZ];
+       char *mask;
+
+       mowgli_strlcpy(ipaddr, src, sizeof ipaddr);
+
+       int is_ipv6 = (strchr(ipaddr, ':') != NULL);
+
+       if (mask = strchr(ipaddr, '/'))
+       {
+               *mask++ = '\0';
+
+               /* Multiple slashes */
+               if (strchr(mask, '/'))
+                       return 0;
+
+               /* Trailing slash */
+               if (!strlen(mask))
+                       return 0;
+
+               int i;
+               for (i = 0; i < strlen(mask); i++)
+               {
+                       if (!isdigit(*(mask + i)))
+                               return 0;
+               }
+
+               if (is_ipv6)
+               {
+                       if (atoi(mask) > 128)
+                               return 0;
+               }
+               else
+               {
+                       if (atoi(mask) > 32)
+                               return 0;
+               }
+       }
+
+       if (is_ipv6)
+               return inet_pton6(ipaddr, buf);
+       else
+               return inet_pton4(ipaddr, buf);
+}
+
 /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
  * vim:ts=8
  * vim:sw=8
index d45f037394689e96c7da80b46787dd86f5fc7a9a..0712cf38e52d748537d7f04c306ea3a02db663f2 100644 (file)
@@ -450,6 +450,13 @@ static void os_cmd_clones_addexempt(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
+       if (!valid_ip_or_mask(ip))
+       {
+               command_fail(si, fault_badparams, _("Invalid IP/mask given."));
+               command_fail(si, fault_badparams, _("Syntax: CLONES ADDEXEMPT <ip> <clones> [!P|!T <minutes>] <reason>"));
+               return;
+       }
+
        clones = atoi(clonesstr);
 
        if (expiry && !strcasecmp(expiry, "!P"))