commit 32f63abb59b5c9f47b4d517e0bbf9cc73fd044dc from: Brett Smith date: Thu Oct 25 18:46:29 2012 UTC Make the maximum /list reply length a configurable limit. commit - 23572af942399288bcf4e67245563b05ff4fc0f7 commit + 32f63abb59b5c9f47b4d517e0bbf9cc73fd044dc blob - 018855d5e1f4490f92291069b635f2afa0cf9c34 blob + 77948af09cb01b84330ed258e9488b8eab8f8c5c --- doc/sample-ngircd.conf.tmpl +++ doc/sample-ngircd.conf.tmpl @@ -99,6 +99,10 @@ # Please note that all servers in an IRC network MUST use the same # maximum nick name length! ;MaxNickLength = 9 + + # Maximum number of channels returned in response to a /list + # command (0: unlimited): + ;MaxListSize = 100 # After seconds of inactivity the server will send a # PING to the peer to test whether it is alive or not. blob - 4ac37ad4033331e11692ee0aee6b87e96b6846ee blob + b60057070f5077bf71c2898368c98b21b795788f --- src/ngircd/conf.c +++ 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; @@ -1455,6 +1457,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg) } if (strcasecmp(Var, "MaxNickLength") == 0) { 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) { blob - 90d74d2096e42d2dd8f28537db28f307e700e5c2 blob + 541fdb294c4aac81114f7b8c458dc4e6f81021f2 --- src/ngircd/conf.h +++ 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 */ blob - b387493c6ab3ca0643a2322e99a26dab23688051 blob + 345f1bed298a9a9bd3e9d7ad417da467d6aeb534 --- src/ngircd/defines.h +++ 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 blob - f9d2dc125d3708b11ad629ed9551b7f08f4b2598 blob + ed4839afdcef63782be0510b876915d3522c8e10 --- src/ngircd/irc-channel.c +++ 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),