Core/Conditions: Catch exceptions caused by invalid WorldStateExpression data

This commit is contained in:
Shauren
2025-05-16 00:47:16 +02:00
parent c6050a319c
commit 3f036bc722

View File

@@ -3285,14 +3285,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
@@ -3634,21 +3634,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)
@@ -3659,15 +3662,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)
{