aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2013-02-18 02:20:42 +0100
committerMachiavelli <machiavelli.trinity@gmail.com>2013-02-18 02:20:42 +0100
commitcc8d5a3aca73698455e636c47a46244b09f2bc5c (patch)
tree1ddd46a486c4fdeb2527e7cfb5e478d9728b2cd7
parent9004d39c09081e40fc6b18a356f1c9d79bc76ee3 (diff)
Core/Vehicles: Prevent infinite loop in VehicleJoinEvent:Abort
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp5
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h5
2 files changed, 9 insertions, 1 deletions
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index c70d6413886..9dd25577fe1 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -811,6 +811,11 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
void VehicleJoinEvent::Abort(uint64)
{
+ // Prevent recursion
+ if (_executedAbort)
+ return;
+
+ _executedAbort = true;
sLog->outDebug(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, board on vehicle GuidLow: %u, Entry: %u SeatId: %i cancelled",
Passenger->GetGUIDLow(), Passenger->GetEntry(), Target->GetBase()->GetGUIDLow(), Target->GetBase()->GetEntry(), (int32)Seat->first);
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 7ec0df8e533..01b8a0c581f 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -107,12 +107,15 @@ class VehicleJoinEvent : public BasicEvent
{
friend class Vehicle;
protected:
- VehicleJoinEvent(Vehicle* v, Unit* u) : Target(v), Passenger(u), Seat(Target->Seats.end()) {}
+ VehicleJoinEvent(Vehicle* v, Unit* u) : Target(v), Passenger(u), Seat(Target->Seats.end()), _executedAbort(false) {}
bool Execute(uint64, uint32);
void Abort(uint64);
Vehicle* Target;
Unit* Passenger;
SeatMap::iterator Seat;
+
+ private:
+ bool _executedAbort;
};
#endif