Send_Message: Fix handling of "empty" targets
authorAlexander Barton <alex@barton.de>
Thu, 7 Jan 2016 00:54:11 +0000 (01:54 +0100)
committerAlexander Barton <alex@barton.de>
Thu, 7 Jan 2016 00:54:11 +0000 (01:54 +0100)
Clients can specify multiple targets for the "PRIVMSG", "NOTICE", and
"SQUERY" commands, separated by commas (e. g. "PRIVMSG a,#b,c :text").

Since commit 49ab79d0 ("Limit the number of message targes, and suppress
duplicates"), ngIRCd crashed when the client sent the separator character
only as target(s), e. g. "," or ",,,," etc.!

This patch fixes the bug and adds a test case for this issue.

Thanks to Florian Westphal <fw@strlen.de> for spotting the issue!

src/ngircd/irc.c
src/testsuite/message-test.e

index 15bb90f..5325b52 100644 (file)
@@ -563,7 +563,9 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
        currentTarget = strtok_r(currentTarget, ",", &strtok_last);
        ngt_UpperStr(Req->command);
 
-       while (true) {
+       /* Please note that "currentTarget" is NULL when the target contains
+        * the separator character only, e. g. "," or ",,,," etc.! */
+       while (currentTarget) {
                /* Make sure that there hasn't been such a target already: */
                targets[target_nr++] = currentTarget;
                for(i = 0; i < target_nr - 1; i++) {
index e463786..9eb22e7 100644 (file)
@@ -38,6 +38,17 @@ expect {
        "@* PRIVMSG nick :test"
 }
 
+send "privmsg ,,,, :dummy\r"
+send "privmsg ,,,nick,,&server,,, :test\r"
+expect {
+       timeout { exit 1 }
+       "@* PRIVMSG nick :test"
+}
+expect {
+       timeout { exit 1 }
+       "404"
+}
+
 send "privmsg Nick,#testChannel,nick :test\r"
 expect {
        timeout { exit 1 }