aboutsummaryrefslogtreecommitdiff
path: root/contrib/epee
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2019-10-17 02:50:18 +0000
committerxiphon <xiphon@protonmail.com>2019-10-18 18:32:33 +0000
commit23ba69ec886ebcb5c529ff22a0c26c50decd1005 (patch)
tree8276763b937bbec6a99ca4f62e43b08698f80c79 /contrib/epee
parentMerge pull request #5990 (diff)
downloadmonero-23ba69ec886ebcb5c529ff22a0c26c50decd1005.tar.xz
epee: fix SSL server handshake, run_one() can block, use poll_one()
Diffstat (limited to 'contrib/epee')
-rw-r--r--contrib/epee/include/net/net_ssl.h1
-rw-r--r--contrib/epee/src/net_ssl.cpp12
2 files changed, 11 insertions, 2 deletions
diff --git a/contrib/epee/include/net/net_ssl.h b/contrib/epee/include/net/net_ssl.h
index d2c1c1a3a..643b2c486 100644
--- a/contrib/epee/include/net/net_ssl.h
+++ b/contrib/epee/include/net/net_ssl.h
@@ -29,6 +29,7 @@
#ifndef _NET_SSL_H
#define _NET_SSL_H
+#include <chrono>
#include <stdint.h>
#include <string>
#include <vector>
diff --git a/contrib/epee/src/net_ssl.cpp b/contrib/epee/src/net_ssl.cpp
index c7dca1914..16454fce0 100644
--- a/contrib/epee/src/net_ssl.cpp
+++ b/contrib/epee/src/net_ssl.cpp
@@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string.h>
+#include <thread>
#include <boost/asio/ssl.hpp>
#include <boost/lambda/lambda.hpp>
#include <openssl/ssl.h>
@@ -519,10 +520,17 @@ bool ssl_options_t::handshake(
boost::system::error_code ec = boost::asio::error::would_block;
socket.async_handshake(type, boost::lambda::var(ec) = boost::lambda::_1);
- while (ec == boost::asio::error::would_block)
+ if (io_service.stopped())
{
io_service.reset();
- io_service.run_one();
+ }
+ while (ec == boost::asio::error::would_block && !io_service.stopped())
+ {
+ // should poll_one(), can't run_one() because it can block if there is
+ // another worker thread executing io_service's tasks
+ // TODO: once we get Boost 1.66+, replace with run_one_for/run_until
+ std::this_thread::sleep_for(std::chrono::milliseconds(30));
+ io_service.poll_one();
}
if (ec)