Merge pull request #5283

16590294 abstract_tcp_server2: fix crashy race on socket shutdown (moneromooo-monero)
This commit is contained in:
Riccardo Spagni 2019-03-21 14:53:03 +02:00
commit f5d7652f73
No known key found for this signature in database
GPG key ID: 55432DF31CCD4FCD

View file

@ -676,9 +676,9 @@ PRAGMA_WARNING_DISABLE_VS(4355)
CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), false, "Unexpected queue size"); CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), false, "Unexpected queue size");
reset_timer(get_default_timeout(), false); reset_timer(get_default_timeout(), false);
async_write(boost::asio::buffer(m_send_que.front().data(), size_now ) , async_write(boost::asio::buffer(m_send_que.front().data(), size_now ) ,
//strand_.wrap( strand_.wrap(
boost::bind(&connection<t_protocol_handler>::handle_write, self, _1, _2) boost::bind(&connection<t_protocol_handler>::handle_write, self, _1, _2)
//) )
); );
//_dbg3("(chunk): " << size_now); //_dbg3("(chunk): " << size_now);
//logger_handle_net_write(size_now); //logger_handle_net_write(size_now);
@ -767,8 +767,9 @@ PRAGMA_WARNING_DISABLE_VS(4355)
// Initiate graceful connection closure. // Initiate graceful connection closure.
m_timer.cancel(); m_timer.cancel();
boost::system::error_code ignored_ec; boost::system::error_code ignored_ec;
if (m_ssl_support == epee::net_utils::ssl_support_t::e_ssl_support_enabled)
socket_.shutdown(ignored_ec);
socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);
socket().close();
if (!m_host.empty()) if (!m_host.empty())
{ {
try { host_count(m_host, -1); } catch (...) { /* ignore */ } try { host_count(m_host, -1); } catch (...) { /* ignore */ }
@ -861,9 +862,9 @@ PRAGMA_WARNING_DISABLE_VS(4355)
do_send_handler_write_from_queue(e, m_send_que.front().size() , m_send_que.size()); // (((H))) do_send_handler_write_from_queue(e, m_send_que.front().size() , m_send_que.size()); // (((H)))
CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), void(), "Unexpected queue size"); CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), void(), "Unexpected queue size");
async_write(boost::asio::buffer(m_send_que.front().data(), size_now) , async_write(boost::asio::buffer(m_send_que.front().data(), size_now) ,
// strand_.wrap( strand_.wrap(
boost::bind(&connection<t_protocol_handler>::handle_write, connection<t_protocol_handler>::shared_from_this(), _1, _2) boost::bind(&connection<t_protocol_handler>::handle_write, connection<t_protocol_handler>::shared_from_this(), _1, _2)
// ) )
); );
//_dbg3("(normal)" << size_now); //_dbg3("(normal)" << size_now);
} }