if(options & CONN_ZIP) /* zlib compression enabled */
strlcat(option_txt, "z", sizeof(option_txt));
#endif
- LogDebug(" *** %d: %d = %s", Idx, options, option_txt);
return option_txt;
} /* Option_String */
CL2CHAN *cl2chan;
CHANNEL *chan;
char *currentTarget = Req->argv[0];
- char *lastCurrentTarget = NULL;
+ char *strtok_last = NULL;
char *message = NULL;
+ char *targets[MAX_HNDL_TARGETS];
+ int i, target_nr = 0;
assert(Client != NULL);
assert(Req != NULL);
message = Req->argv[1];
/* handle msgtarget = msgto *("," msgto) */
- currentTarget = strtok_r(currentTarget, ",", &lastCurrentTarget);
+ currentTarget = strtok_r(currentTarget, ",", &strtok_last);
ngt_UpperStr(Req->command);
+ /* 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++) {
+ if (strcasecmp(currentTarget, targets[i]) == 0)
+ goto send_next_target;
+ }
+
/* Check for and handle valid <msgto> of form:
* RFC 2812 2.3.1:
* msgto = channel / ( user [ "%" host ] "@" servername )
}
send_next_target:
- currentTarget = strtok_r(NULL, ",", &lastCurrentTarget);
- if (currentTarget)
- Conn_SetPenalty(Client_Conn(Client), 1);
+ currentTarget = strtok_r(NULL, ",", &strtok_last);
+ if (!currentTarget)
+ break;
+
+ Conn_SetPenalty(Client_Conn(Client), 1);
+
+ if (target_nr >= MAX_HNDL_TARGETS) {
+ /* Too many targets given! */
+ return IRC_WriteErrClient(Client,
+ ERR_TOOMANYTARGETS_MSG,
+ currentTarget);
+ }
}
return CONNECTED;