commit 08f9d31d60220e8a389a2d24f42625be7749f090 from: Federico G. Schwindt date: Fri Sep 06 22:01:59 2013 UTC Rework check for number of parameters Move most of the checks that return numeric 461 into Handle_Request(). commit - 37609d6a4f036b175fdc304d0ee466bd8ad57bf9 commit + 08f9d31d60220e8a389a2d24f42625be7749f090 blob - 7fcba73fea9bbd14b3f8ec596b98a12c3276a291 blob + 42b0e4da9aa112b464d9754bb2f2632a5f41fedf --- src/ngircd/irc-cap.c +++ src/ngircd/irc-cap.c @@ -249,8 +249,6 @@ IRC_CAP(CLIENT *Client, REQUEST *Req) { assert(Client != NULL); assert(Req != NULL); - - _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2) LogDebug("Got \"%s %s\" command from \"%s\" ...", Req->command, Req->argv[0], Client_ID(Client)); blob - 4bd5a9d1ff30fb4a7e2cb7c909c68d21b93b06a5 blob + ce042043ebe0b3eedc087635e50fc30a6b51610c --- src/ngircd/irc-channel.c +++ src/ngircd/irc-channel.c @@ -309,7 +309,6 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) assert (Client != NULL); assert (Req != NULL); - _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2) _IRC_GET_SENDER_OR_RETURN_(target, Req, Client) /* Is argument "0"? */ @@ -440,7 +439,6 @@ IRC_PART(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2) _IRC_GET_SENDER_OR_RETURN_(target, Req, Client) /* Loop over all the given channel names */ @@ -484,7 +482,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) chan = Channel_Search(Req->argv[0]); @@ -583,7 +580,6 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 2); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) if (Req->argc > 0) blob - 0bbe310a6b29183dd1f803915f9b17de88039ebe blob + 97b518a063b7adbf124d3760faabaa6fc840c712 --- src/ngircd/irc-encoding.c +++ src/ngircd/irc-encoding.c @@ -48,10 +48,6 @@ IRC_CHARCONV(CLIENT *Client, REQUEST *Req) assert (Client != NULL); assert (Req != NULL); - if (Req->argc != 1) - return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); - strlcpy(encoding, Req->argv[0], sizeof(encoding)); ngt_UpperStr(encoding); blob - 9b7dfdaca4917f18b8a1cf7d40c130a1552b0351 blob + 88455c74d9e85c770442aea1aa6f0c54e2e0ab9c --- src/ngircd/irc-info.c +++ src/ngircd/irc-info.c @@ -501,7 +501,6 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -546,7 +545,6 @@ IRC_INFO(CLIENT * Client, REQUEST * Req) IRC_SetPenalty(Client, 2); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -596,8 +594,6 @@ IRC_ISON( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1) - strlcpy(rpl, RPL_ISON_MSG, sizeof rpl); for (i = 0; i < Req->argc; i++) { /* "All" ircd even parse ": ..." arguments and split @@ -636,7 +632,6 @@ IRC_LINKS(CLIENT *Client, REQUEST *Req) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) /* Get pointer to server mask or "*", if none given */ @@ -691,7 +686,6 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -723,8 +717,6 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) - if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) { for (c = Client_First(); c!= NULL; c = Client_Next(c)) { if (Client_Type(c) != CLIENT_SERVICE) @@ -762,7 +754,6 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 3); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -795,7 +786,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -881,7 +871,6 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 2); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from) @@ -1020,7 +1009,6 @@ IRC_TIME( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from) @@ -1055,8 +1043,6 @@ IRC_USERHOST(CLIENT *Client, REQUEST *Req) assert(Req != NULL); IRC_SetPenalty(Client, 1); - - _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1) if (Req->argc > 5) max = 5; @@ -1120,7 +1106,6 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client) _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix) @@ -1156,8 +1141,6 @@ IRC_WHO(CLIENT *Client, REQUEST *Req) IRC_SetPenalty(Client, 1); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) - only_ops = false; if (Req->argc == 2) { if (strcmp(Req->argv[1], "o") == 0) blob - 88804ef2b8b7dd1f95b71522ebc2ff3b84496827 blob + 67a0fbfd803603befe536bc7e61e94eb06ced5a0 --- src/ngircd/irc-login.c +++ src/ngircd/irc-login.c @@ -357,8 +357,6 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) /* Search the originator */ from = Client_Search(Req->prefix); @@ -520,8 +518,6 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) Client_Type(Client) != CLIENT_SERVER) return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG, Client_ID(Client)); - - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 6) if (Client_Type(Client) != CLIENT_SERVER) return IRC_WriteErrClient(Client, ERR_ERRONEUSNICKNAME_MSG, @@ -598,8 +594,6 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) GLOBAL bool IRC_WEBIRC(CLIENT *Client, REQUEST *Req) { - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) - if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0) return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG, Client_ID(Client)); @@ -630,8 +624,6 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) if (Req->argc == 1) strlcpy(quitmsg, Req->argv[0], sizeof quitmsg); blob - b52512ab92afe5d08a47ff16777f04f774bb3b0a blob + f7948e6a0d42cbabcdcd1f2a5e0db6731720884e --- src/ngircd/irc-metadata.c +++ src/ngircd/irc-metadata.c @@ -51,10 +51,6 @@ IRC_METADATA(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - if (Req->argc != 3) - return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); - prefix = Client_Search(Req->prefix); if (!prefix) return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, blob - 88d2294bad203efe377820bc8f9aaee822056544 blob + 38fec0d028b5761bcf2bd432a2633cae9871f7fc --- src/ngircd/irc-mode.c +++ src/ngircd/irc-mode.c @@ -69,7 +69,6 @@ IRC_MODE( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1) _IRC_GET_SENDER_OR_RETURN_(origin, Req, Client) /* Channel or user mode? */ @@ -945,8 +944,6 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req ) assert (Client != NULL); assert (Req != NULL); - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) - if (Req->argc == 1 && Req->argv[0][0]) { Client_SetAway(Client, Req->argv[0]); Client_ModeAdd(Client, 'a'); blob - 4cd4236eefd55cfe64a3cd7a72ce615eeee996c0 blob + 23db579e725e1e54ef01faf4bfdd10616843ac76 --- src/ngircd/irc-op.c +++ src/ngircd/irc-op.c @@ -71,7 +71,6 @@ IRC_KICK(CLIENT *Client, REQUEST *Req) assert( Client != NULL ); assert( Req != NULL ); - _IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 2, 3) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) while (*itemList) { @@ -147,7 +146,6 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req) assert( Client != NULL ); assert( Req != NULL ); - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) /* Search user */ blob - dd408a6fa8bd8c77869397ff8655efcee881bdf6 blob + 40633177a51babbe3d8971453f9b62818bec8a50 --- src/ngircd/irc-oper.c +++ src/ngircd/irc-oper.c @@ -68,8 +68,6 @@ IRC_OPER( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) - len = array_length(&Conf_Opers, sizeof(*op)); op = array_start(&Conf_Opers); for (i = 0; i < len && strcmp(op[i].name, Req->argv[0]); i++) @@ -119,12 +117,6 @@ IRC_DIE(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); -#ifdef STRICT_RFC - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 0) -#else - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) -#endif - if (!Op_Check(Client, Req)) return Op_NoPrivileges(Client, Req); @@ -162,8 +154,6 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 0) - if (!Op_Check(Client, Req)) return Op_NoPrivileges(Client, Req); @@ -190,11 +180,6 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - - /* Bad number of parameters? */ - if (Req->argc != 0) - return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); if (!Op_Check(Client, Req)) return Op_NoPrivileges(Client, Req); @@ -324,11 +309,6 @@ IRC_DISCONNECT(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - - /* Bad number of parameters? */ - if (Req->argc != 1) - return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); if (!Op_Check(Client, Req)) return Op_NoPrivileges(Client, Req); @@ -371,8 +351,6 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 1) - switch (Client_Type(Client)) { case CLIENT_USER: if (!Client_OperByMe(Client)) blob - 107c44a8122d5153d32d696435a0d370890bcabc blob + 80bb6a6141169fe0b03b18063496a2b9d0494800 --- src/ngircd/irc-server.c +++ src/ngircd/irc-server.c @@ -253,8 +253,6 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) strlcpy( nick_in, Req->argv[1], sizeof( nick_in )); strcpy( nick_out, "" ); @@ -341,8 +339,6 @@ IRC_SQUIT(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) - if (Client_Type(Client) != CLIENT_SERVER && !Client_HasMode(Client, 'o')) return Op_NoPrivileges(Client, Req); blob - 968bcea6e58998a7d4d56096f727fa887bc7b37a blob + 7dafaf0539b005bdf808dcefb870838dfae8dfcc --- src/ngircd/irc.c +++ src/ngircd/irc.c @@ -137,8 +137,6 @@ IRC_KILL(CLIENT *Client, REQUEST *Req) if (Client_Type(Client) != CLIENT_SERVER && !Client_OperByMe(Client)) return IRC_WriteErrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client)); - - _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) /* Get prefix (origin); use the client if no prefix is given. */ if (Req->prefix) @@ -361,8 +359,6 @@ IRC_HELP(CLIENT *Client, REQUEST *Req) assert(Req != NULL); IRC_SetPenalty(Client, 2); - - _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) if ((Req->argc == 0 && array_bytes(&Conf_Helptext) > 0) || (Req->argc >= 1 && strcasecmp(Req->argv[0], "Commands") != 0)) { blob - 68aa945fa3eb8be1cfb28afcf8832f23ed3772a8 blob + 7172f411b64c3dbf810c0052eb3ed2ed86a04987 --- src/ngircd/parse.c +++ src/ngircd/parse.c @@ -60,74 +60,78 @@ struct _NUMERIC { static COMMAND My_Commands[] = { - { "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 }, - { "CAP", IRC_CAP, CLIENT_ANY, 0, 0, 0 }, - { "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 }, - { "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 }, - { "ERROR", IRC_ERROR, CLIENT_ANY, 0, 0, 0 }, - { "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "HELP", IRC_HELP, CLIENT_USER, 0, 0, 0 }, - { "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "ISON", IRC_ISON, CLIENT_USER, 0, 0, 0 }, - { "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "METADATA", IRC_METADATA, CLIENT_SERVER, 0, 0, 0 }, - { "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "NICK", IRC_NICK, CLIENT_ANY, 0, 0, 0 }, - { "NJOIN", IRC_NJOIN, CLIENT_SERVER, 0, 0, 0 }, - { "NOTICE", IRC_NOTICE, CLIENT_ANY, 0, 0, 0 }, - { "OPER", IRC_OPER, CLIENT_USER, 0, 0, 0 }, - { "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "PASS", IRC_PASS, CLIENT_ANY, 0, 0, 0 }, - { "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "PONG", IRC_PONG, CLIENT_ANY, 0, 0, 0 }, - { "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "QUIT", IRC_QUIT, CLIENT_ANY, 0, 0, 0 }, - { "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0 }, - { "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0 }, - { "SERVER", IRC_SERVER, CLIENT_ANY, 0, 0, 0 }, - { "SERVICE", IRC_SERVICE, CLIENT_ANY, 0, 0, 0 }, - { "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 0, 0 }, - { "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 0, 0, 0 }, - { "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "USER", IRC_USER, CLIENT_ANY, 0, 0, 0 }, - { "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 }, - { "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 0, 0, 0 }, - { "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 }, - { "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, - { "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, + { "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, + { "AWAY", IRC_AWAY, CLIENT_USER, 0, 1, 0, 0, 0 }, + { "CAP", IRC_CAP, CLIENT_ANY, 1, 2, 0, 0, 0 }, + { "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, +#ifdef STRICT_RFC + { "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0, 0, 0 }, +#else + { "DIE", IRC_DIE, CLIENT_USER, 0, 1, 0, 0, 0 }, +#endif + { "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 1, 1, 0, 0, 0 }, + { "ERROR", IRC_ERROR, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "HELP", IRC_HELP, CLIENT_USER, 0, 1, 0, 0, 0 }, + { "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, + { "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 }, + { "ISON", IRC_ISON, CLIENT_USER, 1, -1, 0, 0, 0 }, + { "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 }, + { "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 2, 3, 0, 0, 0 }, + { "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 }, + { "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "METADATA", IRC_METADATA, CLIENT_SERVER, 3, 3, 0, 0, 0 }, + { "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 1, -1, 0, 0, 0 }, + { "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, + { "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "NICK", IRC_NICK, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "NJOIN", IRC_NJOIN, CLIENT_SERVER, 2, 2, 0, 0, 0 }, + { "NOTICE", IRC_NOTICE, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "OPER", IRC_OPER, CLIENT_USER, 2, 2, 0, 0, 0 }, + { "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 }, + { "PASS", IRC_PASS, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "PONG", IRC_PONG, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "QUIT", IRC_QUIT, CLIENT_ANY, 0, 1, 0, 0, 0 }, + { "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0, 0, 0 }, + { "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0, 0, 0 }, + { "SERVER", IRC_SERVER, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0, 0, 0 }, + { "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 0, 0, 0 }, + { "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 }, + { "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 }, + { "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0, 0, 0 }, + { "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, + { "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 }, + { "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "USER", IRC_USER, CLIENT_ANY, 0, -1, 0, 0, 0 }, + { "USERHOST", IRC_USERHOST, CLIENT_USER, 1, -1, 0, 0, 0 }, + { "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 }, + { "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 1, 1, 0, 0, 0 }, + { "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 4, 4, 0, 0, 0 }, + { "WHO", IRC_WHO, CLIENT_USER, 0, 2, 0, 0, 0 }, + { "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, + { "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 }, #ifdef IRCPLUS - { "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 }, + { "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, -1, 0, 0, 0 }, # ifdef ICONV - { "CHARCONV", IRC_CHARCONV, CLIENT_USER, 0, 0, 0 }, + { "CHARCONV", IRC_CHARCONV, CLIENT_USER, 1, 1, 0, 0, 0 }, # endif #endif #ifndef STRICT_RFC - { "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 }, - { "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 }, + { "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 }, + { "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 }, #endif - { NULL, NULL, 0x0, 0, 0, 0 } /* End-Mark */ + { NULL, NULL, 0x0, 0, 0, 0, 0, 0 } /* End-Mark */ }; static void Init_Request PARAMS(( REQUEST *Req )); @@ -524,6 +528,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req ) Client_ID(client)); } + if (Req->argc < cmd->min_argc || + (cmd->max_argc != -1 && Req->argc > cmd->max_argc)) { + IRC_SetPenalty(client, 2); + return IRC_WriteStrClient(client, ERR_NEEDMOREPARAMS_MSG, + Client_ID(client), Req->command); + } + /* Command is allowed for this client: call it and count * generated bytes in output */ Conn_ResetWCounter(); blob - 0c6f8a66d07e4d299f4bb66025c3aec3fae7ee6b blob + beac227521b6d1d677df721b617f795b7e44bd62 --- src/ngircd/parse.h +++ src/ngircd/parse.h @@ -35,6 +35,8 @@ typedef struct _COMMAND bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request )); /**< Function to handle this command */ CLIENT_TYPE type; /**< Valid client types (bit mask) */ + int min_argc; /**< Min parameters */ + int max_argc; /**< Max parameters */ long lcount, rcount; /**< Number of local and remote calls */ long bytes; /**< Number of bytes created */ } COMMAND;