summaryrefslogtreecommitdiff
path: root/src/server.h
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2013-08-04 08:17:07 +0300
committerPerttu Ahola <celeron55@gmail.com>2013-08-04 10:44:37 +0300
commite6687be4933e5115d31ade014300648051af5047 (patch)
tree320a1bb7ecf718f604ffe386b1d40d547c41d3e3 /src/server.h
parent8831669505905dd9cd415711063f705d8e7ce02c (diff)
downloadminetest-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.h16
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)