From bb531a71b14a43923d8c8f8cd44564b655aa7dee Mon Sep 17 00:00:00 2001 From: C. McEnroe Date: Sun, 5 Apr 2020 13:11:19 -0400 Subject: Error on invalid ISUPPORT values --- handle.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'handle.c') diff --git a/handle.c b/handle.c index 00e854c..8e91810 100644 --- a/handle.c +++ b/handle.c @@ -248,17 +248,26 @@ static void handleReplyISupport(struct Message *msg) { if (!msg->params[i]) continue; set(&network.chanTypes, msg->params[i]); } else if (!strcmp(key, "PREFIX")) { - if (!msg->params[i]) continue; strsep(&msg->params[i], "("); - set(&network.prefixModes, strsep(&msg->params[i], ")")); - set(&network.prefixes, msg->params[i]); - assert(strlen(network.prefixes) == strlen(network.prefixModes)); + char *modes = strsep(&msg->params[i], ")"); + char *prefixes = msg->params[i]; + if (!modes || !prefixes || strlen(modes) != strlen(prefixes)) { + errx(EX_PROTOCOL, "invalid PREFIX value"); + } + set(&network.prefixModes, modes); + set(&network.prefixes, prefixes); } else if (!strcmp(key, "CHANMODES")) { - if (!msg->params[i]) continue; - set(&network.listModes, strsep(&msg->params[i], ",")); - set(&network.paramModes, strsep(&msg->params[i], ",")); - set(&network.setParamModes, strsep(&msg->params[i], ",")); - set(&network.channelModes, strsep(&msg->params[i], ",")); + char *list = strsep(&msg->params[i], ","); + char *param = strsep(&msg->params[i], ","); + char *setParam = strsep(&msg->params[i], ","); + char *channel = strsep(&msg->params[i], ","); + if (!list || !param || !setParam || !channel) { + errx(EX_PROTOCOL, "invalid CHANMODES value"); + } + set(&network.listModes, list); + set(&network.paramModes, param); + set(&network.setParamModes, setParam); + set(&network.channelModes, channel); } else if (!strcmp(key, "EXCEPTS")) { network.excepts = (msg->params[i] ?: "e")[0]; } else if (!strcmp(key, "INVEX")) { -- cgit 1.4.1-2-gfad0