irc.c: reject masks with wildcard after last dot

RFC 2812 says in section 3.3.1 ("Private Messages"):

The mask MUST have at least 1 (one) "." in it and no wildcards
following the last ".".
This commit is contained in:
Florian Westphal 2009-01-18 00:33:34 +01:00
parent 95e8320ca9
commit 5a3128243f
2 changed files with 19 additions and 1 deletions

View File

@ -468,11 +468,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
return DISCONNECTED; return DISCONNECTED;
} else if (ForceType != CLIENT_SERVICE } else if (ForceType != CLIENT_SERVICE
&& (chan = Channel_Search(currentTarget))) { && (chan = Channel_Search(currentTarget))) {
/* channel */
if (!Channel_Write(chan, from, Client, Req->command, if (!Channel_Write(chan, from, Client, Req->command,
SendErrors, Req->argv[1])) SendErrors, Req->argv[1]))
return DISCONNECTED; return DISCONNECTED;
} else if (ForceType != CLIENT_SERVICE } else if (ForceType != CLIENT_SERVICE
/* $#: server/target mask, RFC 2812, sec. 3.3.1 */
&& strchr("$#", currentTarget[0]) && strchr("$#", currentTarget[0])
&& strchr(currentTarget, '.')) { && strchr(currentTarget, '.')) {
/* targetmask */ /* targetmask */
@ -501,6 +501,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
CLIENT *cl; CLIENT *cl;
bool client_match; bool client_match;
char *mask = targetMask + 1; char *mask = targetMask + 1;
const char *check_wildcards;
cl = NULL; cl = NULL;
@ -511,6 +512,21 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
Client_ID(from)); Client_ID(from));
} }
/*
* RFC 2812, sec. 3.3.1 requires that targetMask have at least one
* dot (".") and no wildcards ("*", "?") following the last one.
*/
check_wildcards = strchr(targetMask, '.');
assert(check_wildcards != NULL);
if (check_wildcards &&
check_wildcards[strcspn(check_wildcards, "*?")])
{
if (!SendErrors)
return true;
return IRC_WriteStrClient(from, ERR_WILDTOPLEVEL, targetMask);
}
/* #: hostmask, see RFC 2812, sec. 3.3.1 */
if (targetMask[0] == '#') { if (targetMask[0] == '#') {
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) { for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
if (Client_Type(cl) != CLIENT_USER) if (Client_Type(cl) != CLIENT_USER)
@ -522,6 +538,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
return false; return false;
} }
} else { } else {
assert(targetMask[0] == '$'); /* $: server mask, see RFC 2812, sec. 3.3.1 */
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) { for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
if (Client_Type(cl) != CLIENT_USER) if (Client_Type(cl) != CLIENT_USER)
continue; continue;

View File

@ -96,6 +96,7 @@
#define ERR_NOORIGIN_MSG "409 %s :No origin specified" #define ERR_NOORIGIN_MSG "409 %s :No origin specified"
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)" #define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send" #define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
#define ERR_WILDTOPLEVEL "414 %s :Wildcard in toplevel domain"
#define ERR_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command" #define ERR_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command"
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing" #define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
#define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given" #define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"