diff --git a/ChangeLog b/ChangeLog index 3d880b7b0..aa9fa5c5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,11 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2007-05-18 +ChangeLog - 2007-05-20 Version 0.2.5 (under dev!): + * fixed IRC mode parsing when receiving modes with arguments (bug #19902) * fixed crash with IRC JOIN malformed message (bug #19891) * fixed bug with nick prefixes on some IRC servers (bug #19854) * improved setup file save: now writes temporary file, then rename it diff --git a/src/irc/irc-mode.c b/src/irc/irc-mode.c index 05e00460f..c6f59222d 100644 --- a/src/irc/irc-mode.c +++ b/src/irc/irc-mode.c @@ -117,15 +117,17 @@ irc_mode_channel_set (t_irc_channel *channel, char *modes) break; default: set_flag = irc_mode_channel_get_flag (modes, pos); - ptr_arg = ((argc > 0) && (current_arg >= 0)) ? - argv[current_arg--] : NULL; switch (pos[0]) { case 'a': /* unrealircd specific flag */ + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_CHANADMIN); break; case 'h': + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_HALFOP); break; @@ -135,24 +137,40 @@ irc_mode_channel_set (t_irc_channel *channel, char *modes) free (channel->key); channel->key = NULL; } - if ((set_flag == '+') && ptr_arg) - channel->key = strdup (ptr_arg); + if (set_flag == '+') + { + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; + if (ptr_arg) + channel->key = strdup (ptr_arg); + } break; case 'l': if (set_flag == '-') channel->limit = 0; - if ((set_flag == '+') && ptr_arg) - channel->limit = atoi (ptr_arg); + if (set_flag == '+') + { + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; + if (ptr_arg) + channel->limit = atoi (ptr_arg); + } break; case 'o': + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_OP); break; case 'q': /* unrealircd specific flag */ + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_CHANOWNER); break; case 'v': + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_VOICE); break; diff --git a/weechat/ChangeLog b/weechat/ChangeLog index 3d880b7b0..aa9fa5c5b 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -1,10 +1,11 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2007-05-18 +ChangeLog - 2007-05-20 Version 0.2.5 (under dev!): + * fixed IRC mode parsing when receiving modes with arguments (bug #19902) * fixed crash with IRC JOIN malformed message (bug #19891) * fixed bug with nick prefixes on some IRC servers (bug #19854) * improved setup file save: now writes temporary file, then rename it diff --git a/weechat/src/irc/irc-mode.c b/weechat/src/irc/irc-mode.c index 05e00460f..c6f59222d 100644 --- a/weechat/src/irc/irc-mode.c +++ b/weechat/src/irc/irc-mode.c @@ -117,15 +117,17 @@ irc_mode_channel_set (t_irc_channel *channel, char *modes) break; default: set_flag = irc_mode_channel_get_flag (modes, pos); - ptr_arg = ((argc > 0) && (current_arg >= 0)) ? - argv[current_arg--] : NULL; switch (pos[0]) { case 'a': /* unrealircd specific flag */ + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_CHANADMIN); break; case 'h': + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_HALFOP); break; @@ -135,24 +137,40 @@ irc_mode_channel_set (t_irc_channel *channel, char *modes) free (channel->key); channel->key = NULL; } - if ((set_flag == '+') && ptr_arg) - channel->key = strdup (ptr_arg); + if (set_flag == '+') + { + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; + if (ptr_arg) + channel->key = strdup (ptr_arg); + } break; case 'l': if (set_flag == '-') channel->limit = 0; - if ((set_flag == '+') && ptr_arg) - channel->limit = atoi (ptr_arg); + if (set_flag == '+') + { + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; + if (ptr_arg) + channel->limit = atoi (ptr_arg); + } break; case 'o': + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_OP); break; case 'q': /* unrealircd specific flag */ + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_CHANOWNER); break; case 'v': + ptr_arg = ((argc > 0) && (current_arg >= 0)) ? + argv[current_arg--] : NULL; irc_mode_channel_set_nick (channel, ptr_arg, set_flag, NICK_VOICE); break;