diff options
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/epee/include/int-util.h | 3 | ||||
-rw-r--r-- | contrib/epee/include/net/abstract_tcp_server2.inl | 2 | ||||
-rw-r--r-- | contrib/epee/include/net/net_ssl.h | 1 | ||||
-rw-r--r-- | contrib/epee/src/CMakeLists.txt | 3 | ||||
-rw-r--r-- | contrib/epee/src/int-util.cpp | 48 | ||||
-rw-r--r-- | contrib/epee/src/net_ssl.cpp | 12 |
6 files changed, 65 insertions, 4 deletions
diff --git a/contrib/epee/include/int-util.h b/contrib/epee/include/int-util.h index 8ef5be40a..939c018ea 100644 --- a/contrib/epee/include/int-util.h +++ b/contrib/epee/include/int-util.h @@ -129,6 +129,9 @@ static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uin return remainder; } +// Long divisor with 2^64 base +void div128_64(uint64_t dividend_hi, uint64_t dividend_lo, uint64_t divisor, uint64_t* quotient_hi, uint64_t *quotient_lo, uint64_t *remainder_hi, uint64_t *remainder_lo); + #define IDENT16(x) ((uint16_t) (x)) #define IDENT32(x) ((uint32_t) (x)) #define IDENT64(x) ((uint64_t) (x)) diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl index f4f3786fb..5d12f9466 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.inl +++ b/contrib/epee/include/net/abstract_tcp_server2.inl @@ -1526,7 +1526,7 @@ POP_WARNINGS } - LOG_ERROR("Trying connect to " << adr << ":" << port << ", bind_ip = " << bind_ip_to_use); + MDEBUG("Trying to connect to " << adr << ":" << port << ", bind_ip = " << bind_ip_to_use); //boost::asio::ip::tcp::endpoint remote_endpoint(boost::asio::ip::address::from_string(addr.c_str()), port); boost::asio::ip::tcp::endpoint remote_endpoint(*iterator); 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/CMakeLists.txt b/contrib/epee/src/CMakeLists.txt index 9b9fa5a47..5201f59c2 100644 --- a/contrib/epee/src/CMakeLists.txt +++ b/contrib/epee/src/CMakeLists.txt @@ -27,7 +27,8 @@ # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. add_library(epee STATIC byte_slice.cpp hex.cpp http_auth.cpp mlog.cpp net_helper.cpp net_utils_base.cpp string_tools.cpp wipeable_string.cpp - levin_base.cpp memwipe.c connection_basic.cpp network_throttle.cpp network_throttle-detail.cpp mlocker.cpp buffer.cpp net_ssl.cpp) + levin_base.cpp memwipe.c connection_basic.cpp network_throttle.cpp network_throttle-detail.cpp mlocker.cpp buffer.cpp net_ssl.cpp + int-util.cpp) if (USE_READLINE AND (GNU_READLINE_FOUND OR (DEPENDS AND NOT MINGW))) add_library(epee_readline STATIC readline_buffer.cpp) diff --git a/contrib/epee/src/int-util.cpp b/contrib/epee/src/int-util.cpp new file mode 100644 index 000000000..e9d0822e0 --- /dev/null +++ b/contrib/epee/src/int-util.cpp @@ -0,0 +1,48 @@ +// Copyright (c) 2019, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include <boost/multiprecision/cpp_int.hpp> + +void div128_64(uint64_t dividend_hi, uint64_t dividend_lo, uint64_t divisor, uint64_t* quotient_hi, uint64_t *quotient_lo, uint64_t *remainder_hi, uint64_t *remainder_lo) +{ + typedef boost::multiprecision::uint128_t uint128_t; + + uint128_t dividend = dividend_hi; + dividend <<= 64; + dividend |= dividend_lo; + + uint128_t q, r; + divide_qr(dividend, uint128_t(divisor), q, r); + + *quotient_hi = ((q >> 64) & 0xffffffffffffffffull).convert_to<uint64_t>(); + *quotient_lo = (q & 0xffffffffffffffffull).convert_to<uint64_t>(); + if (remainder_hi) + *remainder_hi = ((r >> 64) & 0xffffffffffffffffull).convert_to<uint64_t>(); + if (remainder_lo) + *remainder_lo = (r & 0xffffffffffffffffull).convert_to<uint64_t>(); +} 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) |