Make the maximum /list reply length a configurable limit.

This commit is contained in:
Brett Smith 2012-10-25 14:46:29 -04:00
parent 23572af942
commit 32f63abb59
5 changed files with 19 additions and 6 deletions

View File

@ -100,6 +100,10 @@
# maximum nick name length!
;MaxNickLength = 9
# Maximum number of channels returned in response to a /list
# command (0: unlimited):
;MaxListSize = 100
# After <PingTimeout> seconds of inactivity the server will send a
# PING to the peer to test whether it is alive or not.
;PingTimeout = 120

View File

@ -350,6 +350,7 @@ Conf_Test( void )
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1);
printf(" MaxListSize = %d\n", Conf_MaxListSize);
printf(" PingTimeout = %d\n", Conf_PingTimeout);
printf(" PongTimeout = %d\n", Conf_PongTimeout);
puts("");
@ -706,6 +707,7 @@ Set_Defaults(bool InitServers)
Conf_MaxConnectionsIP = 5;
Conf_MaxJoins = 10;
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
Conf_MaxListSize = 100;
Conf_PingTimeout = 120;
Conf_PongTimeout = 20;
@ -1457,6 +1459,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg);
return;
}
if (strcasecmp(Var, "MaxListSize") == 0) {
Conf_MaxListSize = atoi(Arg);
if (!Conf_MaxListSize && strcmp(Arg, "0"))
Config_Error_NaN(Line, Var);
return;
}
if (strcasecmp(Var, "PingTimeout") == 0) {
Conf_PingTimeout = atoi(Arg);
if (Conf_PingTimeout < 5) {

View File

@ -220,6 +220,9 @@ GLOBAL int Conf_MaxConnectionsIP;
/** Maximum length of a nick name */
GLOBAL unsigned int Conf_MaxNickLength;
/** Maximum number of channels returned to /list */
GLOBAL int Conf_MaxListSize;
#ifndef STRICT_RFC
/** Require "AUTH PING-PONG" on login */

View File

@ -181,9 +181,6 @@
/* Defaults and limits for IRC commands */
/** Max. number of LIST replies. */
#define MAX_RPL_LIST 100
/** Max. number of elemets allowed in channel invite and ban lists. */
#define MAX_HNDL_CHANNEL_LISTS 50

View File

@ -679,9 +679,10 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
if (!strchr(Channel_Modes(chan), 's')
|| Channel_IsMemberOf(chan, from)
|| (!Conf_MorePrivacy && Client_OperByMe(Client))) {
if (IRC_CheckListTooBig(from, count,
MAX_RPL_LIST,
"LIST"))
if ((Conf_MaxListSize > 0)
&& IRC_CheckListTooBig(from, count,
Conf_MaxListSize,
"LIST"))
break;
if (!IRC_WriteStrClient(from,
RPL_LIST_MSG, Client_ID(from),