diff options
author | jackpoz <giacomopoz@gmail.com> | 2015-09-05 13:54:44 +0200 |
---|---|---|
committer | Carbenium <carbenium@outlook.com> | 2015-09-24 23:42:23 +0200 |
commit | ee7039e845e54dfa5b4a125175dd33391614c1bb (patch) | |
tree | cc0245098496c95822e68e3530a64d1a32b14de3 /src | |
parent | adf6d968edc5027efd5ff4a26186e64af8bac638 (diff) |
Core/Chat: Allow to sanitize | characters when sending messages to clients
Add an optional parameter "escapeCharacters" to ChatHandler::SendSysMessage() to properly escape | character, otherwise it might freeze the client.
(cherry picked from commit 7c91984a64c2f78ad17153018a42926dfcf0ae59)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Chat/Chat.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Chat/Chat.h | 4 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index a262ab42870..d2b94784d41 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -187,13 +187,33 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part) return true; } -void ChatHandler::SendSysMessage(const char *str) +void ChatHandler::SendSysMessage(const char *str, bool escapeCharacters) { WorldPackets::Chat::Chat packet; // need copy to prevent corruption by strtok call in LineFromMessage original string - char* buf = strdup(str); - char* pos = buf; + char* buf; + char* pos; + + if (escapeCharacters && strchr(str, '|')) + { + size_t startPos = 0; + std::ostringstream o; + while (const char* charPos = strchr(str + startPos, '|')) + { + o.write(str + startPos, charPos - str - startPos); + o << "||"; + startPos = charPos - str + 1; + } + o.write(str + startPos, strlen(str) - startPos); + buf = strdup(o.str().c_str()); + } + else + { + buf = strdup(str); + } + + pos = buf; while (char* line = LineFromMessage(pos)) { @@ -1103,7 +1123,7 @@ bool CliHandler::isAvailable(ChatCommand const& cmd) const return cmd.AllowConsole; } -void CliHandler::SendSysMessage(const char *str) +void CliHandler::SendSysMessage(const char *str, bool /*escapeCharacters*/) { m_print(m_callbackArg, str); m_print(m_callbackArg, "\r\n"); diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index d2b688b42a6..34faac68980 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -59,7 +59,7 @@ class ChatHandler // function with different implementation for chat/console virtual char const* GetTrinityString(uint32 entry) const; - virtual void SendSysMessage(char const* str); + virtual void SendSysMessage(char const* str, bool escapeCharacters = false); void SendSysMessage(uint32 entry); @@ -159,7 +159,7 @@ class CliHandler : public ChatHandler char const* GetTrinityString(uint32 entry) const override; bool isAvailable(ChatCommand const& cmd) const override; bool HasPermission(uint32 /*permission*/) const override { return true; } - void SendSysMessage(const char *str) override; + void SendSysMessage(const char *str, bool escapeCharacters) override; std::string GetNameLink() const override; bool needReportToTarget(Player* chr) const override; LocaleConstant GetSessionDbcLocale() const override; |