Make the maximum /list reply length a configurable limit.
authorBrett Smith <brett@w3.org>
Thu, 25 Oct 2012 18:46:29 +0000 (14:46 -0400)
committerBrett Smith <brett@w3.org>
Thu, 25 Oct 2012 18:46:29 +0000 (14:46 -0400)
doc/sample-ngircd.conf.tmpl
src/ngircd/conf.c
src/ngircd/conf.h
src/ngircd/defines.h
src/ngircd/irc-channel.c

index 018855d5e1f4490f92291069b635f2afa0cf9c34..77948af09cb01b84330ed258e9488b8eab8f8c5c 100644 (file)
        # 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
index 4ac37ad4033331e11692ee0aee6b87e96b6846ee..b60057070f5077bf71c2898368c98b21b795788f 100644 (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) {
index 90d74d2096e42d2dd8f28537db28f307e700e5c2..541fdb294c4aac81114f7b8c458dc4e6f81021f2 100644 (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 */
index b387493c6ab3ca0643a2322e99a26dab23688051..345f1bed298a9a9bd3e9d7ad417da467d6aeb534 100644 (file)
 
 /* 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
 
index f9d2dc125d3708b11ad629ed9551b7f08f4b2598..ed4839afdcef63782be0510b876915d3522c8e10 100644 (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),