Core/Session: proper client timeout detection (#1232)

* Core/Session: proper client timeout detection

- Properly detect client timeout when logged into a character after a configurable time (default 60s) has passed without the client sending any packets.
- Fixes issues with crashed clients leaving characters in the world for a very long time (default 15 minutes), as well as edge case exploits involving intentionally pausing client execution for some amount of time.
This commit is contained in:
Viste(Кирилл)
2019-01-08 09:33:24 +03:00
committed by GitHub
parent 09fa4c515b
commit f852a87f9c
6 changed files with 27 additions and 8 deletions

View File

@@ -125,7 +125,7 @@ WorldSession::WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8
{
m_Address = sock->GetRemoteAddress();
sock->AddReference();
ResetTimeOutTime();
ResetTimeOutTime(false);
LoginDatabase.PExecute("UPDATE account SET online = online | (1<<(%u-1)) WHERE id = %u;", realmID, GetAccountId());
}
@@ -251,6 +251,9 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (updater.ProcessLogout())
{
UpdateTimeOutTime(diff);
/// If necessary, kick the player because the client didn't send anything for too long
/// (or they've been idling in character select)
if (IsConnectionIdle())
m_Socket->CloseSocket();
}