diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2011-11-14 01:14:53 +0200 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2011-11-14 01:14:53 +0200 |
commit | d3f1d599d4a9d44f48ae91d84618e3cdc4651aa0 (patch) | |
tree | 737434c6348f370a122c30338cb2e54aed5fa366 | |
parent | 7927b943df1d6d2cb8de5aeedec783e372b02fe3 (diff) |
fixed crash on DOS
-rw-r--r-- | server/server/main.cpp | 11 | ||||
-rw-r--r-- | server/server/main.h | 9 |
2 files changed, 18 insertions, 2 deletions
diff --git a/server/server/main.cpp b/server/server/main.cpp index 52d7102..6b2b9ae 100644 --- a/server/server/main.cpp +++ b/server/server/main.cpp @@ -17,11 +17,16 @@ session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& } void session::cancel_thread(session *s, int minutes) { + if(boost::this_thread::interruption_requested()) + return; + s->crit_lock(); if(s->get_ip().empty()) + { + s->crit_unlock(); return; + } + s->crit_unlock(); boost::this_thread::sleep(boost::posix_time::minutes(minutes)); - if(boost::this_thread::interruption_requested()) - return; s->set_cancel(); } @@ -31,6 +36,7 @@ ssl_socket::lowest_layer_type& session::socket() } session::~session() { + critical_mutex.lock(); if(killer) { killer->interrupt(); @@ -39,6 +45,7 @@ session::~session() logger->lock(); *logger << time_str() << ": Connection with ip "<< remote_ip << " session " << this_sid << " closed\n"; logger->unlock(); + critical_mutex.unlock(); } void session::set_cancel() diff --git a/server/server/main.h b/server/server/main.h index c7eb853..7fcb162 100644 --- a/server/server/main.h +++ b/server/server/main.h @@ -33,6 +33,14 @@ public: void write_wo_response(std::vector<byte>& data); static void cancel_thread(session *s, int minutes); void set_cancel(); + void crit_lock() + { + critical_mutex.lock(); + } + void crit_unlock() + { + critical_mutex.unlock(); + } const std::string& get_ip(); const std::string& get_this_sid() { @@ -49,6 +57,7 @@ private: server *server_; bool blacklisted, canceled; boost::thread *killer; + boost::mutex critical_mutex; }; struct conn_count { |