commit 2205227c3b3cbc8788bcf97a037c9e3016f71c9c from: Alexander Barton date: Mon Sep 10 10:43:44 2012 UTC WHO #channel: don't limit list size It makes no sense to limit the list size when doing WHO for a channel and not to return all the users in that channel, so I removed the check. But if there are more than MAX_RPL_WHO(25) replies, the client requesting the list will be "penalized" one second more (then 2 in total). This fixes bug #125. commit - d2d867ea36b57c594546c5486aa8c2d4ef199af0 commit + 2205227c3b3cbc8788bcf97a037c9e3016f71c9c blob - 6ec184a7caca3011eecae4697683fbaa4a4bbd77 blob + 6eb8d9421922e8606e0e5cbd83729f1c90c7d4b5 --- src/ngircd/irc-info.c +++ src/ngircd/irc-info.c @@ -847,6 +847,8 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool On assert( Client != NULL ); assert( Chan != NULL ); + + IRC_SetPenalty(Client, 1); is_member = Channel_IsMemberOf(Chan, Client); @@ -866,9 +868,6 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool On is_visible = strchr(client_modes, 'i') == NULL; if (is_member || is_visible) { - if (IRC_CheckListTooBig(Client, count, MAX_RPL_WHO, "WHO")) - break; - strcpy(flags, who_flags_status(client_modes)); if (is_ircop) strlcat(flags, "*", sizeof(flags)); @@ -883,6 +882,11 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool On count++; } } + + /* If there are a lot of clients, augment penalty a bit */ + if (count > MAX_RPL_WHO) + IRC_SetPenalty(Client, 1); + return IRC_WriteStrClient(Client, RPL_ENDOFWHO_MSG, Client_ID(Client), Channel_Name(Chan)); } @@ -911,6 +915,7 @@ IRC_WHO_Mask(CLIENT *Client, char *Mask, bool OnlyOps) if (Mask) ngt_LowerStr(Mask); + IRC_SetPenalty(Client, 3); for (c = Client_First(); c != NULL; c = Client_Next(c)) { if (Client_Type(c) != CLIENT_USER) continue; @@ -1014,13 +1019,11 @@ IRC_WHO(CLIENT *Client, REQUEST *Req) chan = Channel_Search(Req->argv[0]); if (chan) { /* Members of a channel have been requested */ - IRC_SetPenalty(Client, 1); return IRC_WHO_Channel(Client, chan, only_ops); } if (strcmp(Req->argv[0], "0") != 0) { /* A mask has been given. But please note this RFC * stupidity: "0" is same as no arguments ... */ - IRC_SetPenalty(Client, 3); return IRC_WHO_Mask(Client, Req->argv[0], only_ops); } }