commit - 1afbf7123635fde41953a5791bed247b12540b63
commit + 2f7d0c08395b3239e446841e713e0e84385200ea
blob - e75866811c3421358c79da33f3af4f15506e80b3
blob + e7a14ef88959069a67f7ecb8f53c7c03c5b2071f
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
/** 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
+
/** Max. number of channel modes with arguments per MODE command. */
#define MAX_HNDL_MODES_ARG 5
blob - fd4cbee4948c23870dd3a3c04da2c6e8b632b3da
blob + 24f25afe4eead0694372f448ac2d751ae5d147fb
--- src/ngircd/irc-info.c
+++ src/ngircd/irc-info.c
return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,
COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1,
- COMMAND_LEN - 113, MAX_HNDL_MODES_ARG);
+ COMMAND_LEN - 113, MAX_HNDL_MODES_ARG,
+ MAX_HNDL_CHANNEL_LISTS);
} /* IRC_Send_ISUPPORT */
blob - bb78bcb6656c8f1a5c2c3fe219d93d9d3db0e986
blob + c85faa04d626f42569fe83c2a7e852bdeb768062
--- src/ngircd/irc-mode.c
+++ src/ngircd/irc-mode.c
if (Lists_CheckDupeMask(list, mask))
return CONNECTED;
+ if (Client_Type(Client) == CLIENT_USER &&
+ Lists_Count(list) >= MAX_HNDL_CHANNEL_LISTS)
+ return IRC_WriteStrClient(Client, ERR_LISTFULL_MSG,
+ Client_ID(Client),
+ Channel_Name(Channel), mask,
+ MAX_HNDL_CHANNEL_LISTS);
if (what == 'I') {
if (!Channel_AddInvite(Channel, mask, false))
blob - fd86f3017efabea10175054619177b982f2a4670
blob + c082f1c4c0b767713608355004cb6b41ae3fa14a
--- src/ngircd/lists.c
+++ src/ngircd/lists.c
}
last = e;
e = next;
+ }
+}
+
+/**
+ * Return the number of entries of a list.
+ *
+ * @param h List head.
+ * @return Number of items.
+ */
+GLOBAL unsigned long
+Lists_Count(struct list_head *h)
+{
+ struct list_elem *e;
+ unsigned long count = 0;
+
+ assert(h != NULL);
+
+ e = h->first;
+ while (e) {
+ count++;
+ e = e->next;
}
+ return count;
}
/* -eof- */
blob - d0b4d819e070aa10397d20387c0240c3c2b580cf
blob + cb2e2c1a188a5dd81ec2aa7f8cd50b51aeba6f82
--- src/ngircd/lists.h
+++ src/ngircd/lists.h
GLOBAL bool Lists_Add PARAMS((struct list_head *h, const char *Mask,
time_t ValidUntil, const char *Reason));
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask));
+GLOBAL unsigned long Lists_Count PARAMS((struct list_head *h));
GLOBAL void Lists_Free PARAMS((struct list_head *head));
blob - 761e36df1dbcb07ddffcf0a91c61fdddd5ec64af
blob + c5d833671c3f882973d1a9ce186ef1adec8145fa
--- src/ngircd/messages.h
+++ src/ngircd/messages.h
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=bI,k,l,imnOPRstz CHANLIMIT=#&+:%d :are supported on this server"
-#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d PENALTY :are supported on this server"
+#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=bI:%d PENALTY :are supported on this server"
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
#define ERR_BADCHANNELKEY_MSG "475 %s %s :Cannot join channel (+k)"
#define ERR_NOCHANMODES_MSG "477 %s %s :Channel doesn't support modes"
+#define ERR_LISTFULL_MSG "478 %s %s %s: Channel list is full (%d)"
#define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied"
#define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator"
#define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!"