X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=blobdiff_plain;f=ircd%2Fircd_string.c;h=ed0349ea45fc20b1d8700cc80c355b82317c0603;hp=bfdceb5aac22c8bec4f660bab9e5c5865621fcc5;hb=b7f25dcf93cc44cd9f5b4132c976e72118bcd44f;hpb=3b70ebff7fa4e07f9959d258c28cf0382829315f diff --git a/ircd/ircd_string.c b/ircd/ircd_string.c index bfdceb5..ed0349e 100644 --- a/ircd/ircd_string.c +++ b/ircd/ircd_string.c @@ -156,6 +156,8 @@ char* ircd_strncpy(char* s1, const char* s2, size_t n) while (s < endp && (*s++ = *s2++)) ; + if (s == endp) + *s = '\0'; return s1; } @@ -479,12 +481,14 @@ ircd_aton_ip4(const char *input, unsigned int *output, unsigned char *pbits) *pbits = bits; return pos; case '.': + if (++dots > 3) + return 0; if (input[++pos] == '.') return 0; - ip |= part << (24 - 8 * dots++); + ip |= part << (32 - 8 * dots); part = 0; if (input[pos] == '*') { - while (input[++pos] == '*') ; + while (input[++pos] == '*' || input[pos] == '.') ; if (input[pos] != '\0') return 0; if (pbits) @@ -574,6 +578,8 @@ ipmask_parse(const char *input, struct irc_in_addr *ip, unsigned char *pbits) if (input[pos] == ':') { if (colon < 8) return 0; + if (ii == 8) + return 0; colon = ii; pos++; } @@ -602,9 +608,11 @@ ipmask_parse(const char *input, struct irc_in_addr *ip, unsigned char *pbits) *pbits = part; goto finish; case '*': - while (input[++pos] == '*') ; + while (input[++pos] == '*' || input[pos] == ':') ; if (input[pos] != '\0' || colon < 8) return 0; + if (part && ii < 8) + ip->in6_16[ii++] = htons(part); if (pbits) *pbits = ii * 16; return pos; @@ -618,6 +626,8 @@ ipmask_parse(const char *input, struct irc_in_addr *ip, unsigned char *pbits) default: return 0; } + if (input[pos] != '\0') + return 0; finish: if (colon < 8) { unsigned int jj; @@ -628,7 +638,7 @@ ipmask_parse(const char *input, struct irc_in_addr *ip, unsigned char *pbits) ip->in6_16[colon + jj] = 0; } return pos; - } else if (dot) { + } else if (dot || strchr(input, '/')) { unsigned int addr; int len = ircd_aton_ip4(input, &addr, pbits); if (len) {