Commit Diff


commit - 95e8320ca99eb9546102d10a329d708458257c56
commit + 5a3128243f4b609b79a2b97ed8cef780198338bb
blob - e5f5bbd5ddeab864b153533fa36336f5cb5d009d
blob + a0dc0ea9b8ed2b3722b736af9cf80575eab85627
--- src/ngircd/irc.c
+++ src/ngircd/irc.c
@@ -468,11 +468,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int Force
 				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 
 	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 
 					  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 
 					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;
blob - 562f778de1c8a86810231bb23826ca9e6b2446ea
blob + 209485a828245d443fc85cfceef6826da4a31f30
--- src/ngircd/messages.h
+++ 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"