Core/Conditions: Catch exceptions caused by invalid WorldStateExpression data

(cherry picked from commit 3f036bc722)
This commit is contained in:
Shauren
2025-05-16 00:47:16 +02:00
committed by Ovahlord
parent 220db41a76
commit 9deca512b4

View File

@@ -3189,14 +3189,14 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
return true;
}
ByteBuffer HexToBytes(const std::string& hex)
static ByteBuffer HexToBytes(std::string_view const& hex)
{
ByteBuffer buffer(hex.length() / 2, ByteBuffer::Resize{});
Trinity::Impl::HexStrToByteArray(hex, buffer.data(), buffer.size());
return buffer;
}
static int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const*, uint32, uint32) =
static constexpr int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const*, uint32, uint32) =
{
// WSE_FUNCTION_NONE
[](Map const* /*map*/, uint32 /*arg1*/, uint32 /*arg2*/) -> int32
@@ -3538,21 +3538,24 @@ bool EvalRelOp(ByteBuffer& buffer, Map const* map)
return false;
}
bool ConditionMgr::IsMeetingWorldStateExpression(Map const* map, WorldStateExpressionEntry const* expression)
bool ConditionMgr::IsMeetingWorldStateExpression(Map const* map, WorldStateExpressionEntry const* expression) try
{
ByteBuffer buffer = HexToBytes(expression->Expression);
if (buffer.empty())
return false;
bool enabled = buffer.read<bool>();
uint8 enabled = buffer.read<uint8>();
if (!enabled)
return false;
bool finalResult = EvalRelOp(buffer, map);
WorldStateExpressionLogic resultLogic = buffer.read<WorldStateExpressionLogic>();
while (resultLogic != WorldStateExpressionLogic::None)
do
{
WorldStateExpressionLogic resultLogic = buffer.read<WorldStateExpressionLogic>();
if (resultLogic == WorldStateExpressionLogic::None)
break;
bool secondResult = EvalRelOp(buffer, map);
switch (resultLogic)
@@ -3563,15 +3566,15 @@ bool ConditionMgr::IsMeetingWorldStateExpression(Map const* map, WorldStateExpre
default:
break;
}
if (buffer.rpos() >= buffer.size())
break;
resultLogic = buffer.read<WorldStateExpressionLogic>();
}
} while (buffer.rpos() >= buffer.size());
return finalResult;
}
catch (std::exception const& e)
{
TC_LOG_ERROR("condition", "Failed to parse WorldStateExpression {}: {}", expression->ID, e.what());
return false;
}
int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitConditionVariable variable, int32 value)
{