abstract_tcp_server2: guard against negative timeouts

This commit is contained in:
moneromooo-monero 2019-12-16 18:24:29 +00:00
parent b4e1dc83d2
commit 352bd13254
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -363,8 +363,8 @@ PRAGMA_WARNING_DISABLE_VS(4355)
} }
delay *= 0.5; delay *= 0.5;
if (delay > 0) {
long int ms = (long int)(delay * 100); long int ms = (long int)(delay * 100);
if (ms > 0) {
reset_timer(boost::posix_time::milliseconds(ms + 1), true); reset_timer(boost::posix_time::milliseconds(ms + 1), true);
boost::this_thread::sleep_for(boost::chrono::milliseconds(ms)); boost::this_thread::sleep_for(boost::chrono::milliseconds(ms));
} }
@ -721,7 +721,9 @@ PRAGMA_WARNING_DISABLE_VS(4355)
boost::posix_time::milliseconds connection<t_protocol_handler>::get_timeout_from_bytes_read(size_t bytes) boost::posix_time::milliseconds connection<t_protocol_handler>::get_timeout_from_bytes_read(size_t bytes)
{ {
boost::posix_time::milliseconds ms = (boost::posix_time::milliseconds)(unsigned)(bytes * TIMEOUT_EXTRA_MS_PER_BYTE); boost::posix_time::milliseconds ms = (boost::posix_time::milliseconds)(unsigned)(bytes * TIMEOUT_EXTRA_MS_PER_BYTE);
ms += m_timer.expires_from_now(); const auto cur = m_timer.expires_from_now().total_milliseconds();
if (cur > 0)
ms += (boost::posix_time::milliseconds)cur;
if (ms > get_default_timeout()) if (ms > get_default_timeout())
ms = get_default_timeout(); ms = get_default_timeout();
return ms; return ms;
@ -747,7 +749,12 @@ PRAGMA_WARNING_DISABLE_VS(4355)
template<class t_protocol_handler> template<class t_protocol_handler>
void connection<t_protocol_handler>::reset_timer(boost::posix_time::milliseconds ms, bool add) void connection<t_protocol_handler>::reset_timer(boost::posix_time::milliseconds ms, bool add)
{ {
MTRACE("Setting " << ms << " expiry"); if (ms.total_milliseconds() < 0)
{
MWARNING("Ignoring negative timeout " << ms);
return;
}
MTRACE((add ? "Adding" : "Setting") << " " << ms << " expiry");
auto self = safe_shared_from_this(); auto self = safe_shared_from_this();
if(!self) if(!self)
{ {
@ -760,7 +767,11 @@ PRAGMA_WARNING_DISABLE_VS(4355)
return; return;
} }
if (add) if (add)
ms += m_timer.expires_from_now(); {
const auto cur = m_timer.expires_from_now().total_milliseconds();
if (cur > 0)
ms += (boost::posix_time::milliseconds)cur;
}
m_timer.expires_from_now(ms); m_timer.expires_from_now(ms);
m_timer.async_wait([=](const boost::system::error_code& ec) m_timer.async_wait([=](const boost::system::error_code& ec)
{ {