From 0d6c2978ae7a595b5be2ab0da6a919c3e2c1dc6d Mon Sep 17 00:00:00 2001 From: ariel- Date: Tue, 11 Apr 2017 23:23:52 -0300 Subject: [PATCH] Core/Creature: fix integer overflow in Creature::Update leading to endless thrashing of characters database Closes #19182 --- src/server/game/Entities/Creature/Creature.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 64281ca544..c280578ac4 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -531,7 +531,18 @@ void Creature::Update(uint32 diff) if (targetGuid == dbtableHighGuid) // if linking self, never respawn (check delayed to next day) SetRespawnTime(DAY); else - m_respawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); // else copy time from master and add a little + { + // else copy time from master and add a little + time_t baseRespawnTime = std::max(linkedRespawntime, now); + time_t const offset = urand(5, MINUTE); + + // linked guid can be a boss, uses std::numeric_limits::max to never respawn in that instance + // we shall inherit it instead of adding and causing an overflow + if (baseRespawnTime <= std::numeric_limits::max() - offset) + m_respawnTime = baseRespawnTime + offset; + else + m_respawnTime = std::numeric_limits::max(); + } SaveRespawnTime(); // also save to DB immediately } }