mirror of
https://github.com/osmarks/ngircd.git
synced 2025-05-11 11:44:09 +00:00
Fixed abort() ("server crash") when INVITE'ing users to nonexistent
channels. Bug found by <hiddenx@wp.pl>. (from HEAD)
This commit is contained in:
parent
c31167572b
commit
e75f23cfe8
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
|
|
||||||
static char UNUSED id[] = "$Id: irc-op.c,v 1.11 2002/12/12 12:24:18 alex Exp $";
|
static char UNUSED id[] = "$Id: irc-op.c,v 1.11.4.1 2003/12/05 13:33:12 alex Exp $";
|
||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -69,14 +69,14 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
|
|||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
/* Falsche Anzahl Parameter? */
|
/* Wrong number of parameters? */
|
||||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
||||||
|
|
||||||
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
|
||||||
else from = Client;
|
else from = Client;
|
||||||
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
|
||||||
|
|
||||||
/* User suchen */
|
/* Search user */
|
||||||
target = Client_Search( Req->argv[0] );
|
target = Client_Search( Req->argv[0] );
|
||||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
|
||||||
|
|
||||||
@ -84,36 +84,38 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
if( chan )
|
if( chan )
|
||||||
{
|
{
|
||||||
/* Der Channel existiert bereits; ist der User Mitglied? */
|
/* Channel exists. Is the user a valid member of the channel? */
|
||||||
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
|
if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
|
||||||
|
|
||||||
/* Ist der Channel "invite-only"? */
|
/* Is the channel "invite-only"? */
|
||||||
if( strchr( Channel_Modes( chan ), 'i' ))
|
if( strchr( Channel_Modes( chan ), 'i' ))
|
||||||
{
|
{
|
||||||
/* Ja. Der User muss Channel-Operator sein! */
|
/* Yes. The user must be channel operator! */
|
||||||
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
|
||||||
remember = TRUE;
|
remember = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ist der Ziel-User bereits Mitglied? */
|
/* Is the target user already member of the channel? */
|
||||||
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
|
if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
|
||||||
}
|
|
||||||
|
|
||||||
/* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
|
/* If the target user is banned on that channel: remember invite */
|
||||||
if( Lists_CheckBanned( target, chan )) remember = TRUE;
|
if( Lists_CheckBanned( target, chan )) remember = TRUE;
|
||||||
|
|
||||||
|
if( remember )
|
||||||
|
{
|
||||||
|
/* We must memember this invite */
|
||||||
|
if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
|
Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
|
||||||
if( remember )
|
|
||||||
{
|
|
||||||
if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* an Ziel-Client forwarden ... */
|
/* Inform target client */
|
||||||
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
|
IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
|
||||||
|
|
||||||
if( Client_Conn( target ) > NONE )
|
if( Client_Conn( target ) > NONE )
|
||||||
{
|
{
|
||||||
/* lokaler Ziel-Client, Status-Code melden */
|
/* The target user is local, so we have to send the status code */
|
||||||
if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
|
if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user