1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-01-27 15:54:45 +00:00

Don't send trailing space in MODE messages

Under some circumstances ngIRCd currently issues a channel MODE message
with a trailing space after the last parameter, which isn't permitted by
the grammar in RFC 2812 section 2.3.1:

http://tools.ietf.org/html/rfc2812#section-2.3.1

The following patch modifies mode-test.e to expose this, and modifies
irc-mode.c to correct it.
This commit is contained in:
Dana Dahlstrom 2008-02-16 11:27:48 +00:00 committed by Florian Westphal
parent 634ef8c131
commit 1784180bf3
3 changed files with 11 additions and 13 deletions

View File

@ -11,6 +11,8 @@
ngIRCd HEAD ngIRCd HEAD
- Under some circumstances ngIRCd issued
channel MODE messages with a trailing space. (Dana Dahlstrom)
- IRC_WHO now supports search patterns and will test this - IRC_WHO now supports search patterns and will test this
against user nickname/servername/hostname, etc. as required by against user nickname/servername/hostname, etc. as required by
RFC 2812, Section 3.6.1. (reported by Dana Dahlstrom) RFC 2812, Section 3.6.1. (reported by Dana Dahlstrom)
@ -744,4 +746,4 @@ ngIRCd 0.0.1, 31.12.2001
-- --
$Id: ChangeLog,v 1.337 2008/02/11 11:06:33 fw Exp $ $Id: ChangeLog,v 1.338 2008/02/16 11:27:48 fw Exp $

View File

@ -14,7 +14,7 @@
#include "portab.h" #include "portab.h"
static char UNUSED id[] = "$Id: irc-mode.c,v 1.50 2007/10/14 12:08:57 alex Exp $"; static char UNUSED id[] = "$Id: irc-mode.c,v 1.51 2008/02/16 11:27:49 fw Exp $";
#include "imp.h" #include "imp.h"
#include <assert.h> #include <assert.h>
@ -317,7 +317,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Prepare reply string */ /* Prepare reply string */
if( set ) strcpy( the_modes, "+" ); if( set ) strcpy( the_modes, "+" );
else strcpy( the_modes, "-" ); else strcpy( the_modes, "-" );
strcpy( the_args, " " ); the_args[0] = '\0';
x[1] = '\0'; x[1] = '\0';
ok = CONNECTED; ok = CONNECTED;
@ -528,8 +528,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Channel-User-Mode */ /* Channel-User-Mode */
if( Channel_UserModeAdd( Channel, client, x[0] )) if( Channel_UserModeAdd( Channel, client, x[0] ))
{ {
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
strlcat( the_args, " ", sizeof( the_args )); strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
strlcat( the_modes, x, sizeof( the_modes )); strlcat( the_modes, x, sizeof( the_modes ));
Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client )); Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
} }
@ -552,8 +552,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Channel-User-Mode */ /* Channel-User-Mode */
if( Channel_UserModeDel( Channel, client, x[0] )) if( Channel_UserModeDel( Channel, client, x[0] ))
{ {
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
strlcat( the_args, " ", sizeof( the_args )); strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, Client_ID( client ), sizeof( the_args ));
strlcat( the_modes, x, sizeof( the_modes )); strlcat( the_modes, x, sizeof( the_modes ));
Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client )); Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client ));
} }
@ -572,8 +572,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Are there additional arguments to add? */ /* Are there additional arguments to add? */
if( argadd[0] ) if( argadd[0] )
{ {
len = strlen( the_args ) - 1; strlcat( the_args, " ", sizeof( the_args ));
if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, argadd, sizeof( the_args )); strlcat( the_args, argadd, sizeof( the_args ));
} }
} }
@ -586,9 +585,6 @@ chan_exit:
len = strlen( the_modes ) - 1; len = strlen( the_modes ) - 1;
if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0'; if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
/* Clean up argument string if there are none */
if( ! the_args[1] ) the_args[0] = '\0';
if( Client_Type( Client ) == CLIENT_SERVER ) if( Client_Type( Client ) == CLIENT_SERVER )
{ {
/* Forward mode changes to channel users and other servers */ /* Forward mode changes to channel users and other servers */

View File

@ -1,4 +1,4 @@
# $Id: mode-test.e,v 1.6 2004/03/10 20:40:06 alex Exp $ # $Id: mode-test.e,v 1.7 2008/02/16 11:27:49 fw Exp $
spawn telnet localhost 6789 spawn telnet localhost 6789
expect { expect {
@ -72,7 +72,7 @@ expect {
send "mode #channel +v nick\r" send "mode #channel +v nick\r"
expect { expect {
timeout { exit 1 } timeout { exit 1 }
"@* MODE #channel +v nick" "@* MODE #channel +v nick\r"
} }
send "mode #channel +I nick1\r" send "mode #channel +I nick1\r"
@ -96,7 +96,7 @@ expect {
send "mode #channel -vo nick nick\r" send "mode #channel -vo nick nick\r"
expect { expect {
timeout { exit 1 } timeout { exit 1 }
"@* MODE #channel -vo nick nick" "@* MODE #channel -vo nick nick\r"
} }
send "quit\r" send "quit\r"