repo: ngircd action: commit revision: path_from: revision_from: 32f63abb59b5c9f47b4d517e0bbf9cc73fd044dc: path_to: revision_to:
commit 32f63abb59b5c9f47b4d517e0bbf9cc73fd044dc Author: Brett SmithDate: Thu Oct 25 14:46:29 2012 -0400 Make the maximum /list reply length a configurable limit. diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl
--- a/doc/sample-ngircd.conf.tmpl +++ b/doc/sample-ngircd.conf.tmpl @@ -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 + # Afterseconds of inactivity the server will send a # PING to the peer to test whether it is alive or not. ;PingTimeout = 120 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -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) {
diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h
--- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -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 */ diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
--- a/src/ngircd/defines.h +++ b/src/ngircd/defines.h @@ -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 diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c
--- a/src/ngircd/irc-channel.c
+++ b/src/ngircd/irc-channel.c
@@ -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),
-----END OF PAGE-----