Marcus Glocker <mar...@nazgul.ch> writes: > On Sun, Jun 05, 2016 at 08:04:26AM +0200, Marcus Glocker wrote: > >> ICB has been designed for a user always need to be joined to a group. >> With the irssi-icb module you can break this rule currently by running >> the '/window close' command and therefore crash irssi simply: >> >> /window close >> /j 2 >> Segmentation fault (core dumped) >> >> icb-channels.c:icb_change_channel() will try to compare the current >> group with the new group on the next join command, and in case of a >> previous '/window close' irssi has already destroyed our group and >> freed the reference to it. Hence icb_change_channel() is comparing >> a group string against a freed memory address and segfaults. >> >> Attached patch disables the '/window close' command for ICB >> connections, since this just shouldn't be supported. > > This is an improved version of the last diff. It still allows one to > close windows for private queries but just returns an error when you > try to close your ICB group window.
I would prefer if /wc would just disconnect from the server, there is no point in keeping the connection around since as you say a user is supposed to always be joined to a group. Are you sure that only /wc could get irssi confused? That said... > I will also try to push this one upstream. > > Anyone brave around to ok this? :-) Your diff fixes a crash which would be very annoying for people that also use irssi for other purposes than icb, thus I think it's a valuable addition. ok jca@, but please also unbind cmd_window in icb_commands_deinit, as in the updated patch below. Index: Makefile =================================================================== RCS file: /cvs/ports/net/irssi-icb/Makefile,v retrieving revision 1.39 diff -u -p -r1.39 Makefile --- Makefile 16 Mar 2016 21:19:38 -0000 1.39 +++ Makefile 12 Jun 2016 04:50:01 -0000 @@ -7,6 +7,7 @@ GH_PROJECT= irssi-icb GH_COMMIT= 8f7060835355d5f620a5d3b75a45336ab8efefd9 DISTNAME= irssi-icb-0.16pre20160307 +REVISION= 0 CATEGORIES= net Index: patches/patch-src_core_icb-commands_c =================================================================== RCS file: patches/patch-src_core_icb-commands_c diff -N patches/patch-src_core_icb-commands_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_core_icb-commands_c 12 Jun 2016 04:49:13 -0000 @@ -0,0 +1,50 @@ +$OpenBSD$ +--- src/core/icb-commands.c.orig Mon Mar 7 09:54:15 2016 ++++ src/core/icb-commands.c Sun Jun 12 06:49:09 2016 +@@ -19,6 +19,7 @@ + */ + + #include "module.h" ++#include "../fe-common/core/fe-windows.h" + + #include "icb-commands.h" + #include "icb-servers.h" +@@ -101,6 +102,24 @@ static void cmd_beep(const char *data, ICB_SERVER_REC + } + } + ++static void cmd_window(const char *data, ICB_SERVER_REC *server) ++{ ++ CMD_ICB_SERVER(server); ++ ++ /* ++ * Return an error in case the '/window close' command has been ++ * issued in your active ICB group window. In ICB you always ++ * need to be joined to one group. ++ */ ++ if (*data != '\0' && (*data == 'c' || *data == 'C')) { ++ if (!strcmp(window_get_active_name(active_win), ++ server->group->name)) { ++ cmd_return_error(CMDERR_ILLEGAL_PROTO); ++ signal_stop(); ++ } ++ } ++} ++ + void icb_commands_init(void) + { + char **cmd; +@@ -116,6 +135,7 @@ void icb_commands_init(void) + command_bind_icb("kick", NULL, (SIGNAL_FUNC) cmd_boot); + command_bind_icb("g", NULL, (SIGNAL_FUNC) cmd_group); + command_bind_icb("beep", NULL, (SIGNAL_FUNC) cmd_beep); ++ command_bind_icb("window", NULL, (SIGNAL_FUNC) cmd_window); + + command_set_options("connect", "+icbnet"); + } +@@ -134,4 +154,5 @@ void icb_commands_deinit(void) + command_unbind("kick", (SIGNAL_FUNC) cmd_boot); + command_unbind("g", (SIGNAL_FUNC) cmd_group); + command_unbind("beep", (SIGNAL_FUNC) cmd_beep); ++ command_unbind("window", (SIGNAL_FUNC) cmd_window); + } -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE