Module: ngircd.git Branch: master Commit: 5a3128243f4b609b79a2b97ed8cef780198338bb URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=5a312...
Author: Florian Westphal fw@strlen.de Date: Sun Jan 18 00:33:34 2009 +0100
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 ".".
---
src/ngircd/irc.c | 19 ++++++++++++++++++- src/ngircd/messages.h | 1 + 2 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index e5f5bbd..a0dc0ea 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -468,11 +468,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors) return DISCONNECTED; } else if (ForceType != CLIENT_SERVICE && (chan = Channel_Search(currentTarget))) { - /* channel */ if (!Channel_Write(chan, from, Client, Req->command, SendErrors, Req->argv[1])) return DISCONNECTED; } else if (ForceType != CLIENT_SERVICE + /* $#: server/target mask, RFC 2812, sec. 3.3.1 */ && strchr("$#", currentTarget[0]) && strchr(currentTarget, '.')) { /* targetmask */ @@ -501,6 +501,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask, CLIENT *cl; bool client_match; char *mask = targetMask + 1; + const char *check_wildcards;
cl = NULL;
@@ -511,6 +512,21 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask, 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] == '#') { for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) { if (Client_Type(cl) != CLIENT_USER) @@ -522,6 +538,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask, return false; } } else { + assert(targetMask[0] == '$'); /* $: server mask, see RFC 2812, sec. 3.3.1 */ for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) { if (Client_Type(cl) != CLIENT_USER) continue; diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h index 562f778..209485a 100644 --- a/src/ngircd/messages.h +++ b/src/ngircd/messages.h @@ -96,6 +96,7 @@ #define ERR_NOORIGIN_MSG "409 %s :No origin specified" #define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)" #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_NOMOTD_MSG "422 %s :MOTD file is missing" #define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"