Skip to content
This repository was archived by the owner on Apr 24, 2022. It is now read-only.

Commit fe98290

Browse files
authoredMar 28, 2018
Merge pull request #945 from joequant/fix-client-crash
attempt to fix disconnect crash
2 parents a75cfa5 + e08c064 commit fe98290

File tree

2 files changed

+13
-25
lines changed

2 files changed

+13
-25
lines changed
 

‎libpoolprotocols/stratum/EthStratumClient.cpp

+7-24
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,11 @@ static void diffToTarget(uint32_t *target, double diff)
3333

3434

3535
EthStratumClient::EthStratumClient(int const & worktimeout, string const & email, bool const & submitHashrate) : PoolClient(),
36-
m_socket(nullptr),
37-
m_securesocket(nullptr),
36+
m_socket(nullptr),
3837
m_worktimer(m_io_service),
3938
m_responsetimer(m_io_service),
4039
m_hashrate_event(m_io_service),
41-
m_resolver(m_io_service)
40+
m_resolver(m_io_service)
4241
{
4342
m_authorized = false;
4443
m_pending = 0;
@@ -54,15 +53,6 @@ EthStratumClient::~EthStratumClient()
5453
{
5554
m_io_service.stop();
5655
m_serviceThread.join();
57-
58-
if (m_connection.SecLevel() != SecureLevel::NONE) {
59-
if (m_securesocket)
60-
delete m_securesocket;
61-
}
62-
else {
63-
if (m_socket)
64-
delete m_socket;
65-
}
6656
}
6757

6858
void EthStratumClient::connect()
@@ -85,7 +75,7 @@ void EthStratumClient::connect()
8575
method = boost::asio::ssl::context::tlsv12;
8676

8777
boost::asio::ssl::context ctx(method);
88-
m_securesocket = new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(m_io_service, ctx);
78+
m_securesocket = std::make_shared<boost::asio::ssl::stream<boost::asio::ip::tcp::socket> >(m_io_service, ctx);
8979
m_socket = &m_securesocket->next_layer();
9080

9181
if (m_connection.SecLevel() != SecureLevel::ALLOW_SELFSIGNED) {
@@ -127,7 +117,8 @@ void EthStratumClient::connect()
127117
}
128118
}
129119
else {
130-
m_socket = new boost::asio::ip::tcp::socket(m_io_service);
120+
m_nonsecuresocket = std::make_shared<boost::asio::ip::tcp::socket>(m_io_service);
121+
m_socket = m_nonsecuresocket.get();
131122
}
132123

133124
// Activate keep alive to detect disconnects
@@ -182,14 +173,6 @@ void EthStratumClient::disconnect()
182173
catch (std::exception const& _e) {
183174
cwarn << "Error while disconnecting:" << _e.what();
184175
}
185-
186-
if (m_connection.SecLevel() != SecureLevel::NONE) {
187-
delete m_securesocket;
188-
}
189-
else {
190-
delete m_socket;
191-
}
192-
193176
m_authorized = false;
194177
m_connected.store(false, std::memory_order_relaxed);
195178

@@ -233,7 +216,7 @@ void EthStratumClient::async_write_with_response()
233216
boost::asio::placeholders::error));
234217
}
235218
else {
236-
async_write(*m_socket, m_requestBuffer,
219+
async_write(*m_nonsecuresocket, m_requestBuffer,
237220
boost::bind(&EthStratumClient::handleResponse, this,
238221
boost::asio::placeholders::error));
239222
}
@@ -606,7 +589,7 @@ void EthStratumClient::hashrate_event_handler(const boost::system::error_code& e
606589
async_write(*m_securesocket, m_requestBuffer,
607590
boost::bind(&EthStratumClient::handleHashrateResponse, this, boost::asio::placeholders::error));
608591
else
609-
async_write(*m_socket, m_requestBuffer,
592+
async_write(*m_nonsecuresocket, m_requestBuffer,
610593
boost::bind(&EthStratumClient::handleHashrateResponse, this, boost::asio::placeholders::error));
611594
}
612595

‎libpoolprotocols/stratum/EthStratumClient.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,12 @@ class EthStratumClient : public PoolClient
7373
std::thread m_serviceThread; ///< The IO service thread.
7474
boost::asio::io_service m_io_service;
7575
boost::asio::ip::tcp::socket *m_socket;
76-
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> *m_securesocket;
76+
// Use shared ptrs to avoid crashes due to async_writes
77+
// see https://stackoverflow.com/questions/41526553/can-async-write-cause-segmentation-fault-when-this-is-deleted
78+
std::shared_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket> >
79+
m_securesocket;
80+
std::shared_ptr<boost::asio::ip::tcp::socket>
81+
m_nonsecuresocket;
7782

7883
boost::asio::streambuf m_requestBuffer;
7984
boost::asio::streambuf m_responseBuffer;

0 commit comments

Comments
 (0)