From 87228429d6ff0cb0f8c100b2f8db59d955a79036 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 1 Dec 2016 19:24:15 -0500 Subject: [PATCH] handle receive_from errors --- SSU.cpp | 55 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/SSU.cpp b/SSU.cpp index 91c14ccf..cd0c0292 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -199,13 +199,26 @@ namespace transport boost::system::error_code ec; size_t moreBytes = m_Socket.available(ec); - while (moreBytes && packets.size () < 25) - { - packet = new SSUPacket (); - packet->len = m_Socket.receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V4), packet->from); - packets.push_back (packet); - moreBytes = m_Socket.available(); - } + if (!ec) + { + while (moreBytes && packets.size () < 25) + { + packet = new SSUPacket (); + packet->len = m_Socket.receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V4), packet->from, 0, ec); + if (!ec) + { + packets.push_back (packet); + moreBytes = m_Socket.available(ec); + if (ec) break; + } + else + { + LogPrint (eLogError, "SSU: receive_from error: ", ec.message ()); + delete packet; + break; + } + } + } m_Service.post (std::bind (&SSUServer::HandleReceivedPackets, this, packets, &m_Sessions)); Receive (); @@ -231,15 +244,29 @@ namespace transport std::vector packets; packets.push_back (packet); - size_t moreBytes = m_SocketV6.available (); - while (moreBytes && packets.size () < 25) + boost::system::error_code ec; + size_t moreBytes = m_SocketV6.available (ec); + if (!ec) { - packet = new SSUPacket (); - packet->len = m_SocketV6.receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V6), packet->from); - packets.push_back (packet); - moreBytes = m_SocketV6.available(); + while (moreBytes && packets.size () < 25) + { + packet = new SSUPacket (); + packet->len = m_SocketV6.receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V6), packet->from, 0, ec); + if (!ec) + { + packets.push_back (packet); + moreBytes = m_SocketV6.available(ec); + if (ec) break; + } + else + { + LogPrint (eLogError, "SSU: v6 receive_from error: ", ec.message ()); + delete packet; + break; + } + } } - + m_ServiceV6.post (std::bind (&SSUServer::HandleReceivedPackets, this, packets, &m_SessionsV6)); ReceiveV6 (); }