From f6c2805b91161a01378c9bbe853521c08d460c60 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Thu, 17 Mar 2016 22:27:05 +0100 Subject: [PATCH 1/2] Do not assume any default value for statusmsg. If the server didn't send it then just skip the check, the old value it defaulted to was possibly overlapping with the CHANTYPES leading to an incorrect behaviour. Fixes #435. --- src/irc/core/irc-servers.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 81f0c269..d6fb8018 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -81,12 +81,12 @@ static int ischannel_func(SERVER_REC *server, const char *data) chantypes = g_hash_table_lookup(irc_server->isupport, "chantypes"); if (chantypes == NULL) chantypes = "#&!+"; /* normal, local, secure, modeless */ - statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg"); - if (statusmsg == NULL) - statusmsg = "@+"; - while (strchr(statusmsg, *data) != NULL) - data++; + statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg"); + if (statusmsg != NULL) { + while (strchr(statusmsg, *data) != NULL) + data++; + } return strchr(chantypes, *data) != NULL; } From f31d37a85271e0196aeefd409f0ab361ffd8c2ff Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Fri, 18 Mar 2016 22:50:00 +0100 Subject: [PATCH 2/2] Make ischannel_func return false for empty strings --- src/irc/core/irc-servers.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index d6fb8018..1df95f70 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -78,17 +78,23 @@ static int ischannel_func(SERVER_REC *server, const char *data) IRC_SERVER_REC *irc_server = (IRC_SERVER_REC *) server; char *chantypes, *statusmsg; + g_return_val_if_fail(data != NULL, FALSE); + + /* empty string is no channel */ + if (*data == '\0') + return FALSE; + chantypes = g_hash_table_lookup(irc_server->isupport, "chantypes"); if (chantypes == NULL) chantypes = "#&!+"; /* normal, local, secure, modeless */ statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg"); - if (statusmsg != NULL) { - while (strchr(statusmsg, *data) != NULL) - data++; - } + if (statusmsg != NULL) + data += strspn(data, statusmsg); - return strchr(chantypes, *data) != NULL; + /* strchr(3) considers the trailing NUL as part of the string, make sure + * we didn't advance too much. */ + return *data != '\0' && strchr(chantypes, *data) != NULL; } static char **split_line(const SERVER_REC *server, const char *line,