Core/Tickets: Fix memory leak when malformed CMSG_GMTICKET_CREATE is received

This commit is contained in:
Dehravor
2014-01-18 21:12:56 +01:00
parent 68af9376f6
commit e60977911a
3 changed files with 43 additions and 24 deletions

View File

@@ -34,26 +34,13 @@ inline float GetAge(uint64 t) { return float(time(NULL) - t) / DAY; }
// GM ticket
GmTicket::GmTicket() : _id(0), _playerGuid(0), _posX(0), _posY(0), _posZ(0), _mapId(0), _createTime(0), _lastModifiedTime(0),
_closedBy(0), _assignedTo(0), _completed(false), _escalatedStatus(TICKET_UNASSIGNED), _viewed(false),
_needResponse(false), _haveTicket(false) { }
_needResponse(false), _needMoreHelp(false) { }
GmTicket::GmTicket(Player* player, WorldPacket& recvData) : _createTime(time(NULL)), _lastModifiedTime(time(NULL)), _closedBy(0), _assignedTo(0), _completed(false), _escalatedStatus(TICKET_UNASSIGNED), _viewed(false), _haveTicket(false)
GmTicket::GmTicket(Player* player) : _createTime(time(NULL)), _lastModifiedTime(time(NULL)), _closedBy(0), _assignedTo(0), _completed(false), _escalatedStatus(TICKET_UNASSIGNED), _viewed(false), _needMoreHelp(false)
{
_id = sTicketMgr->GenerateTicketId();
_playerName = player->GetName();
_playerGuid = player->GetGUID();
uint32 mapId;
recvData >> mapId; // Map is sent as UInt32!
_mapId = mapId;
recvData >> _posX;
recvData >> _posY;
recvData >> _posZ;
recvData >> _message;
uint32 needResponse;
recvData >> needResponse;
_needResponse = (needResponse == 17); // Requires GM response. 17 = true, 1 = false (17 is default)
recvData >> _haveTicket; // Requests further GM interaction on a ticket to which a GM has already responded. Basically means "has a new ticket"
}
GmTicket::~GmTicket() { }
@@ -80,7 +67,7 @@ bool GmTicket::LoadFromDB(Field* fields)
_completed = fields[++index].GetBool();
_escalatedStatus = GMTicketEscalationStatus(fields[++index].GetUInt8());
_viewed = fields[++index].GetBool();
_haveTicket = fields[++index].GetBool();
_needMoreHelp = fields[++index].GetBool();
return true;
}
@@ -107,7 +94,7 @@ void GmTicket::SaveToDB(SQLTransaction& trans) const
stmt->setBool (++index, _completed);
stmt->setUInt8 (++index, uint8(_escalatedStatus));
stmt->setBool (++index, _viewed);
stmt->setBool (++index, _haveTicket);
stmt->setBool (++index, _needMoreHelp);
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
@@ -124,7 +111,7 @@ void GmTicket::WritePacket(WorldPacket& data) const
data << uint32(GMTICKET_STATUS_HASTEXT);
data << uint32(_id);
data << _message;
data << uint8(_haveTicket);
data << uint8(_needMoreHelp);
data << GetAge(_lastModifiedTime);
if (GmTicket* ticket = sTicketMgr->GetOldestOpenTicket())
data << GetAge(ticket->GetLastModifiedTime());
@@ -220,6 +207,20 @@ void GmTicket::SetUnassigned()
}
}
void GmTicket::SetPosition(uint32 mapId, float x, float y, float z)
{
_mapId = mapId;
_posX = x;
_posY = y;
_posZ = z;
}
void GmTicket::SetGmAction(uint32 needResponse, bool needMoreHelp)
{
_needResponse = (needResponse == 17); // Requires GM response. 17 = true, 1 = false (17 is default)
_needMoreHelp = needMoreHelp; // Requests further GM interaction on a ticket to which a GM has already responded. Basically means "has a new ticket"
}
void GmTicket::TeleportTo(Player* player) const
{
player->TeleportTo(_mapId, _posX, _posY, _posZ, 0.0f, 0);