aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorANAND <ClobberXD@gmail.com>2019-11-26 00:33:34 +0530
committerrubenwardy <rw@rubenwardy.com>2019-12-31 21:31:53 +0000
commitfa858530cc2c241a676562584fe024ab48773149 (patch)
treee866e527263914693e78529b02c37d48f00301f7 /builtin
parent1c61fe5ed930720485ef42571739e5efc39a14c9 (diff)
downloadminetest-fa858530cc2c241a676562584fe024ab48773149.tar.gz
minetest-fa858530cc2c241a676562584fe024ab48773149.tar.bz2
minetest-fa858530cc2c241a676562584fe024ab48773149.zip
Use a safer implementation of gsub in core.chat_format_message (#9133)
This search-and-replace implementation does not use Lua pattern-matching
Diffstat (limited to 'builtin')
-rw-r--r--builtin/game/chat.lua30
1 files changed, 22 insertions, 8 deletions
diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua
index ad703b94c..d0d456a46 100644
--- a/builtin/game/chat.lua
+++ b/builtin/game/chat.lua
@@ -1,27 +1,41 @@
-- Minetest: builtin/game/chat.lua
+-- Helper function that implements search and replace without pattern matching
+-- Returns the string and a boolean indicating whether or not the string was modified
+local function safe_gsub(s, replace, with)
+ local i1, i2 = s:find(replace, 1, true)
+ if not i1 then
+ return s, false
+ end
+
+ return s:sub(1, i1 - 1) .. with .. s:sub(i2 + 1), true
+end
+
--
-- Chat message formatter
--
-- Implemented in Lua to allow redefinition
function core.format_chat_message(name, message)
- local str = core.settings:get("chat_message_format")
local error_str = "Invalid chat message format - missing %s"
- local i
+ local str = core.settings:get("chat_message_format")
+ local replaced
- str, i = str:gsub("@name", name, 1)
- if i == 0 then
+ -- Name
+ str, replaced = safe_gsub(str, "@name", name)
+ if not replaced then
error(error_str:format("@name"), 2)
end
- str, i = str:gsub("@message", message, 1)
- if i == 0 then
+ -- Timestamp
+ str = safe_gsub(str, "@timestamp", os.date("%H:%M:%S", os.time()))
+
+ -- Insert the message into the string only after finishing all other processing
+ str, replaced = safe_gsub(str, "@message", message)
+ if not replaced then
error(error_str:format("@message"), 2)
end
- str = str:gsub("@timestamp", os.date("%H:%M:%S", os.time()), 1)
-
return str
end