aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-16 00:47:16 +0200
committerShauren <shauren.trinity@gmail.com>2025-05-16 00:47:16 +0200
commit3f036bc722153b459c4792cde2ecda9641c1e7b9 (patch)
tree70c201908a1734d53710c53540efebf399ae6ebe
parentc6050a319c42ce645faf703d01cd66b0923934b9 (diff)
Core/Conditions: Catch exceptions caused by invalid WorldStateExpression data
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 30d752050ca..d83e04f0200 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -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)
{