summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2011-11-14 01:14:53 +0200
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2011-11-14 01:14:53 +0200
commitd3f1d599d4a9d44f48ae91d84618e3cdc4651aa0 (patch)
tree737434c6348f370a122c30338cb2e54aed5fa366
parent7927b943df1d6d2cb8de5aeedec783e372b02fe3 (diff)
fixed crash on DOS
-rw-r--r--server/server/main.cpp11
-rw-r--r--server/server/main.h9
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
{