diff --git a/VM/src/lstrlib.cpp b/VM/src/lstrlib.cpp index bbed2d5a..69fd0d67 100644 --- a/VM/src/lstrlib.cpp +++ b/VM/src/lstrlib.cpp @@ -1034,8 +1034,13 @@ static int str_format(lua_State* L) } case '*': { - sprintf(buff, "%s", luaL_tolstring(L, arg, NULL)); - break; + size_t length; + const char* string = luaL_tolstring(L, arg, &length); + + luaL_reservebuffer(&b, length, -1); + luaL_addlstring(&b, string, length); + + continue; /* skip the `addsize' at the end */ } default: { /* also treat cases `pnLlh' */ diff --git a/tests/conformance/strings.lua b/tests/conformance/strings.lua index 30732e85..f07fb4bd 100644 --- a/tests/conformance/strings.lua +++ b/tests/conformance/strings.lua @@ -143,6 +143,9 @@ assert(pcall(function() string.format("%* %* %*", return_two_nils()) end) == false) +assert(string.format("%*", "a\0b\0c") == "a\0b\0c") +assert(string.format("%*", string.rep("doge", 3000)) == string.rep("doge", 3000)) + assert(loadstring("return 1\n--comentário sem EOL no final")() == 1)