diff --git a/rts/ExternalAI/AICallback.cpp b/rts/ExternalAI/AICallback.cpp index 527f3e958e7..57a1c907574 100644 --- a/rts/ExternalAI/AICallback.cpp +++ b/rts/ExternalAI/AICallback.cpp @@ -1822,12 +1822,12 @@ const float3* CAICallback::GetStartPos() -#define AICALLBACK_CALL_LUA(HandleName) \ - const char* CAICallback::CallLua ## HandleName(const char* inData, int inSize) { \ - if (lua ## HandleName == nullptr) \ - return nullptr; \ - \ - return lua ## HandleName->RecvSkirmishAIMessage(team, inData, inSize); \ +#define AICALLBACK_CALL_LUA(HandleName) \ + const char* CAICallback::CallLua ## HandleName(const char* inData, int inSize, size_t* outSize) { \ + if (lua ## HandleName == nullptr) \ + return nullptr; \ + \ + return lua ## HandleName->RecvSkirmishAIMessage(team, inData, inSize, outSize); \ } AICALLBACK_CALL_LUA(Rules) diff --git a/rts/ExternalAI/AICallback.h b/rts/ExternalAI/AICallback.h index e0f7eaf7bf5..18aba228c39 100644 --- a/rts/ExternalAI/AICallback.h +++ b/rts/ExternalAI/AICallback.h @@ -255,8 +255,8 @@ class CAICallback // 2. if inSize is less than 0, the data size is calculated using strlen() // 3. the return data is subject to lua garbage collection, // copy it if you wish to continue using it - const char* CallLuaRules(const char* inData, int inSize = -1); - const char* CallLuaUI(const char* inData, int inSize = -1); + const char* CallLuaRules(const char* inData, int inSize, size_t* outSize); + const char* CallLuaUI(const char* inData, int inSize, size_t* outSize); // never called, implemented in SSkirmishAICallbackImpl std::map GetMyInfo() { return std::map(); } diff --git a/rts/ExternalAI/SSkirmishAICallbackImpl.cpp b/rts/ExternalAI/SSkirmishAICallbackImpl.cpp index 08157b5bc54..fd4cd70ce28 100644 --- a/rts/ExternalAI/SSkirmishAICallbackImpl.cpp +++ b/rts/ExternalAI/SSkirmishAICallbackImpl.cpp @@ -794,14 +794,15 @@ EXPORT(int) skirmishAiCallback_Engine_handleCommand( #define SSAICALLBACK_CALL_LUA(HandleName, HANDLENAME) \ case COMMAND_CALL_LUA_ ## HANDLENAME: { \ SCallLua ## HandleName ## Command* cmd = static_cast(commandData); \ - const char* outData = clb->CallLua ## HandleName(cmd->inData, cmd->inSize); \ - if (cmd->ret_outData != NULL) { \ - if (outData != NULL) { \ - const int len = std::min(int(strlen(outData)), MAX_RESPONSE_SIZE - 1); \ - strncpy(cmd->ret_outData, outData, len); \ - cmd->ret_outData[len] = '\0'; \ - } else { \ - cmd->ret_outData[0] = '\0'; \ + size_t len = 0; \ + const char* outData = clb->CallLua ## HandleName(cmd->inData, cmd->inSize, &len); \ + if (cmd->ret_outData != NULL) { \ + if (outData != NULL) { \ + len = std::min(len, size_t(MAX_RESPONSE_SIZE - 1)); \ + strncpy(cmd->ret_outData, outData, len); \ + cmd->ret_outData[len] = '\0'; \ + } else { \ + cmd->ret_outData[0] = '\0'; \ } \ } \ } break; diff --git a/rts/Lua/LuaHandle.cpp b/rts/Lua/LuaHandle.cpp index e8de1ea7fe2..b05a07716f7 100644 --- a/rts/Lua/LuaHandle.cpp +++ b/rts/Lua/LuaHandle.cpp @@ -2360,7 +2360,7 @@ bool CLuaHandle::GameSetup(const string& state, bool& ready, -const char* CLuaHandle::RecvSkirmishAIMessage(int aiTeam, const char* inData, int inSize) +const char* CLuaHandle::RecvSkirmishAIMessage(int aiTeam, const char* inData, int inSize, size_t* outSize) { LUA_CALL_IN_CHECK(L, nullptr); luaL_checkstack(L, 4, __func__); @@ -2389,7 +2389,7 @@ const char* CLuaHandle::RecvSkirmishAIMessage(int aiTeam, const char* inData, in return nullptr; if (lua_isstring(L, -1)) - outData = lua_tolstring(L, -1, nullptr); + outData = lua_tolstring(L, -1, outSize); lua_pop(L, 1); return outData; diff --git a/rts/Lua/LuaHandle.h b/rts/Lua/LuaHandle.h index 07e5cb80d2c..2114791d87d 100644 --- a/rts/Lua/LuaHandle.h +++ b/rts/Lua/LuaHandle.h @@ -204,7 +204,7 @@ class CLuaHandle : public CEventClient bool GameSetup(const std::string& state, bool& ready, const std::vector< std::pair >& playerStates) override; - const char* RecvSkirmishAIMessage(int aiID, const char* data, int inSize); + const char* RecvSkirmishAIMessage(int aiID, const char* data, int inSize, size_t* outSize); std::string WorldTooltip(const CUnit* unit, const CFeature* feature, diff --git a/rts/Lua/LuaRules.h b/rts/Lua/LuaRules.h index 700443f6640..88f70cb00b1 100644 --- a/rts/Lua/LuaRules.h +++ b/rts/Lua/LuaRules.h @@ -37,8 +37,8 @@ class CLuaRules : public CSplitLuaHandle void Cob2Lua(const LuaHashString& funcName, const CUnit* unit, int& argsCount, int args[MAX_LUA_COB_ARGS]); - const char* RecvSkirmishAIMessage(int aiID, const char* data, int inSize) { - return syncedLuaHandle.RecvSkirmishAIMessage(aiID, data, inSize); + const char* RecvSkirmishAIMessage(int aiID, const char* data, int inSize, size_t* outSize) { + return syncedLuaHandle.RecvSkirmishAIMessage(aiID, data, inSize, outSize); } private: