diff options
author | Perttu Ahola <celeron55@gmail.com> | 2013-08-04 08:17:07 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2013-08-04 10:44:37 +0300 |
commit | e6687be4933e5115d31ade014300648051af5047 (patch) | |
tree | 320a1bb7ecf718f604ffe386b1d40d547c41d3e3 /src/server.h | |
parent | 8831669505905dd9cd415711063f705d8e7ce02c (diff) | |
download | minetest-e6687be4933e5115d31ade014300648051af5047.tar.gz minetest-e6687be4933e5115d31ade014300648051af5047.tar.bz2 minetest-e6687be4933e5115d31ade014300648051af5047.zip |
Fix server getting completely choked up on even a little of DoS
* If client count is unbearable, immediately delete denied clients
* Re-prioritize the checking order of things about incoming clients
* Remove a huge CPU-wasting exception in ReliablePacketBuffer
Diffstat (limited to 'src/server.h')
-rw-r--r-- | src/server.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/server.h b/src/server.h index 4d8d0ca67..d49ecdf7b 100644 --- a/src/server.h +++ b/src/server.h @@ -250,6 +250,8 @@ public: bool definitions_sent; + bool denied; + RemoteClient(): m_time_from_building(9999), m_excess_gotblocks(0) @@ -259,6 +261,7 @@ public: net_proto_version = 0; pending_serialization_version = SER_FMT_VER_INVALID; definitions_sent = false; + denied = false; m_nearest_unsent_d = 0; m_nearest_unsent_reset_timer = 0.0; m_nothing_to_send_counter = 0; @@ -589,7 +592,7 @@ private: void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value); void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask); void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value); - + /* Send a node removal/addition event to all clients except ignore_id. Additionally, if far_players!=NULL, players further away than @@ -658,11 +661,20 @@ private: void DiePlayer(u16 peer_id); void RespawnPlayer(u16 peer_id); + void DenyAccess(u16 peer_id, const std::wstring &reason); + + enum ClientDeletionReason { + CDR_LEAVE, + CDR_TIMEOUT, + CDR_DENY + }; + void DeleteClient(u16 peer_id, ClientDeletionReason reason); void UpdateCrafting(u16 peer_id); // When called, connection mutex should be locked RemoteClient* getClient(u16 peer_id); + RemoteClient* getClientNoEx(u16 peer_id); // When called, environment mutex should be locked std::string getPlayerName(u16 peer_id) @@ -737,7 +749,7 @@ private: std::map<u16, RemoteClient*> m_clients; u16 m_clients_number; //for announcing masterserver - // Bann checking + // Ban checking BanManager m_banmanager; // Rollback manager (behind m_env_mutex) |