Module: ngircd.git Branch: master Commit: 88f6fc5fd8617a2d517c1e7ed689a29dce2a217f URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=88f6f...
Author: Alexander Barton alex@barton.de Date: Tue Aug 2 00:56:49 2011 +0200
IRC_QUIT(): disconnect directly linked servers sending QUIT
Without this patch, the server becomes removed from the network and the client structures, but the connection isn't shut down at all ...
---
src/ngircd/irc-login.c | 40 +++++++++++++++++++++++----------------- 1 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 067703a..73716fe 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -653,32 +653,37 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) CLIENT *target; char quitmsg[LINE_LEN];
- assert( Client != NULL ); - assert( Req != NULL ); + assert(Client != NULL); + assert(Req != NULL);
/* Wrong number of arguments? */ - if( Req->argc > 1 ) - return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + if (Req->argc > 1) + return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID(Client), Req->command);
if (Req->argc == 1) strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
- if ( Client_Type( Client ) == CLIENT_SERVER ) - { + if (Client_Type(Client) == CLIENT_SERVER) { /* Server */ - target = Client_Search( Req->prefix ); - if( ! target ) - { - Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client )); + target = Client_Search(Req->prefix); + if (!target) { + Log(LOG_WARNING, + "Got QUIT from %s for unknown client!?", + Client_ID(Client)); return CONNECTED; }
- Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true); - - return CONNECTED; - } - else - { + if (target != Client) { + Client_Destroy(target, "Got QUIT command.", + Req->argc == 1 ? quitmsg : NULL, true); + return CONNECTED; + } else { + Conn_Close(Client_Conn(Client), "Got QUIT command.", + Req->argc == 1 ? quitmsg : NULL, true); + return DISCONNECTED; + } + } else { if (Req->argc == 1 && quitmsg[0] != '"') { /* " " to avoid confusion */ strlcpy(quitmsg, """, sizeof quitmsg); @@ -687,7 +692,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) }
/* User, Service, or not yet registered */ - Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true); + Conn_Close(Client_Conn(Client), "Got QUIT command.", + Req->argc == 1 ? quitmsg : NULL, true);
return DISCONNECTED; }