X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=blobdiff_plain;f=ircd%2Fchannel.c;h=04d28a2953972db110cf1e24f580ca4546c9e402;hp=8ed3eb9c845011f6d3585f54399e02ae6d3b874b;hb=7013ebce8f2bc856983cc97a188376b72e7cd89c;hpb=b41bd506a1da169102d71d8170e753b94377b82c diff --git a/ircd/channel.c b/ircd/channel.c index 8ed3eb9..04d28a2 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -2330,15 +2330,41 @@ mode_parse_limit(struct ParseState *state, int *flag_p) } } -/** Helper function to clean key-like parameters. */ -static void -clean_key(char *s) +/** Helper function to validate key-like parameters. + * + * @param[in] state Parse state for feedback to user. + * @param[in] s Key to validate. + * @param[in] command String to pass for need_more_params() command. + * @return Zero on an invalid key, non-zero if the key was okay. + */ +static int +is_clean_key(struct ParseState *state, char *s, char *command) { - int t_len = KEYLEN; + int ii; - while (*s > ' ' && *s != ':' && *s != ',' && t_len--) - s++; - *s = '\0'; + if (s[0] == '\0') { + if (MyUser(state->sptr)) + need_more_params(state->sptr, command); + return 0; + } + else if (s[0] == ':') { + if (MyUser(state->sptr)) + send_reply(state->sptr, ERR_INVALIDKEY, state->chptr->chname); + return 0; + } + for (ii = 0; (ii <= KEYLEN) && (s[ii] != '\0'); ++ii) { + if ((unsigned char)s[ii] <= ' ' || s[ii] == ',') { + if (MyUser(state->sptr)) + send_reply(state->sptr, ERR_INVALIDKEY, state->chptr->chname); + return 0; + } + } + if (ii > KEYLEN) { + if (MyUser(state->sptr)) + send_reply(state->sptr, ERR_INVALIDKEY, state->chptr->chname); + return 0; + } + return 1; } /* @@ -2383,14 +2409,10 @@ mode_parse_key(struct ParseState *state, int *flag_p) state->done |= DONE_KEY_DEL; } - /* clean up the key string */ - clean_key(t_str); - if (!*t_str || *t_str == ':') { /* warn if empty */ - if (MyUser(state->sptr)) - need_more_params(state->sptr, state->dir == MODE_ADD ? "MODE +k" : - "MODE -k"); + /* If the key is invalid, tell the user and bail. */ + if (!is_clean_key(state, t_str, state->dir == MODE_ADD ? "MODE +k" : + "MODE -k")) return; - } if (!state->mbuf) return; @@ -2495,14 +2517,10 @@ mode_parse_upass(struct ParseState *state, int *flag_p) state->done |= DONE_UPASS_DEL; } - /* clean up the upass string */ - clean_key(t_str); - if (!*t_str || *t_str == ':') { /* warn if empty */ - if (MyUser(state->sptr)) - need_more_params(state->sptr, state->dir == MODE_ADD ? "MODE +U" : - "MODE -U"); + /* If the Upass is invalid, tell the user and bail. */ + if (!is_clean_key(state, t_str, state->dir == MODE_ADD ? "MODE +U" : + "MODE -U")) return; - } if (!state->mbuf) return; @@ -2642,14 +2660,10 @@ mode_parse_apass(struct ParseState *state, int *flag_p) state->done |= DONE_APASS_DEL; } - /* clean up the apass string */ - clean_key(t_str); - if (!*t_str || *t_str == ':') { /* warn if empty */ - if (MyUser(state->sptr)) - need_more_params(state->sptr, state->dir == MODE_ADD ? "MODE +A" : - "MODE -A"); + /* If the Apass is invalid, tell the user and bail. */ + if (!is_clean_key(state, t_str, state->dir == MODE_ADD ? "MODE +A" : + "MODE -A")) return; - } if (!state->mbuf) return;