mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 11:05:54 +00:00
Fix crash on bad resolve. Fix peer shutdown logic. Fix peer tracking logic.
This commit is contained in:
@@ -53,7 +53,7 @@ bool ConnectionPool::addToMap(const uint160& hanko, Peer::pointer peer)
|
|||||||
return peerMap.insert(std::make_pair(hanko, peer)).second;
|
return peerMap.insert(std::make_pair(hanko, peer)).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConnectionPool::delFromMap(const uint160& hanko, Peer::pointer peer)
|
bool ConnectionPool::delFromMap(const uint160& hanko)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock sl(peerLock);
|
boost::mutex::scoped_lock sl(peerLock);
|
||||||
std::map<uint160, Peer::pointer>::iterator it=peerMap.find(hanko);
|
std::map<uint160, Peer::pointer>::iterator it=peerMap.find(hanko);
|
||||||
@@ -83,6 +83,8 @@ std::map<uint160, Peer::pointer> ConnectionPool::getAllConnected()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ConnectionPool::connectTo(const std::string& host, const std::string& port)
|
bool ConnectionPool::connectTo(const std::string& host, const std::string& port)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
boost::asio::ip::tcp::resolver res(theApp->getIOService());
|
boost::asio::ip::tcp::resolver res(theApp->getIOService());
|
||||||
boost::asio::ip::tcp::resolver::query query(host.c_str(), port.c_str());
|
boost::asio::ip::tcp::resolver::query query(host.c_str(), port.c_str());
|
||||||
@@ -99,5 +101,10 @@ bool ConnectionPool::connectTo(const std::string& host, const std::string& port)
|
|||||||
boost::mutex::scoped_lock sl(peerLock);
|
boost::mutex::scoped_lock sl(peerLock);
|
||||||
mPeers.push_back(peer);
|
mPeers.push_back(peer);
|
||||||
peer->connected(boost::system::error_code());
|
peer->connected(boost::system::error_code());
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public:
|
|||||||
// hanko->peer mapping functions
|
// hanko->peer mapping functions
|
||||||
bool inMap(const uint160& hanko);
|
bool inMap(const uint160& hanko);
|
||||||
bool addToMap(const uint160& hanko, Peer::pointer peer);
|
bool addToMap(const uint160& hanko, Peer::pointer peer);
|
||||||
bool delFromMap(const uint160& hanko, Peer::pointer peer);
|
bool delFromMap(const uint160& hanko);
|
||||||
Peer::pointer findInMap(const uint160& hanko);
|
Peer::pointer findInMap(const uint160& hanko);
|
||||||
std::map<uint160, Peer::pointer> getAllConnected();
|
std::map<uint160, Peer::pointer> getAllConnected();
|
||||||
|
|
||||||
|
|||||||
30
Peer.cpp
30
Peer.cpp
@@ -43,6 +43,12 @@ void Peer::handle_write(const boost::system::error_code& error, size_t bytes_tra
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Peer::detach()
|
||||||
|
{
|
||||||
|
mSocket.close();
|
||||||
|
if(!!mHanko) theApp->getConnectionPool().delFromMap(mHanko);
|
||||||
|
}
|
||||||
|
|
||||||
void Peer::connected(const boost::system::error_code& error)
|
void Peer::connected(const boost::system::error_code& error)
|
||||||
{
|
{
|
||||||
if(!error)
|
if(!error)
|
||||||
@@ -52,7 +58,11 @@ void Peer::connected(const boost::system::error_code& error)
|
|||||||
sendHello();
|
sendHello();
|
||||||
start_read_header();
|
start_read_header();
|
||||||
}
|
}
|
||||||
else cout << "Peer::connected Error: " << error << endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error;
|
else
|
||||||
|
{
|
||||||
|
detach();
|
||||||
|
cout << "Peer::connected Error: " << error << endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,9 +113,19 @@ void Peer::handle_read_header(const boost::system::error_code& error)
|
|||||||
if(!error)
|
if(!error)
|
||||||
{
|
{
|
||||||
unsigned msg_len = PackedMessage::getLength(mReadbuf);
|
unsigned msg_len = PackedMessage::getLength(mReadbuf);
|
||||||
|
// WRITEME: Compare to maximum message length, abort if too large
|
||||||
|
if(msg_len>(32*1024*1024))
|
||||||
|
{
|
||||||
|
detach();
|
||||||
|
return;
|
||||||
|
}
|
||||||
start_read_body(msg_len);
|
start_read_body(msg_len);
|
||||||
}
|
}
|
||||||
else cout << "Peer::connected Error: " << error << endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error;
|
else
|
||||||
|
{
|
||||||
|
detach();
|
||||||
|
cout << "Peer::connected Error: " << error << endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Peer::handle_read_body(const boost::system::error_code& error)
|
void Peer::handle_read_body(const boost::system::error_code& error)
|
||||||
@@ -115,7 +135,11 @@ void Peer::handle_read_body(const boost::system::error_code& error)
|
|||||||
processReadBuffer();
|
processReadBuffer();
|
||||||
start_read_header();
|
start_read_header();
|
||||||
}
|
}
|
||||||
else cout << "Peer::connected Error: " << error << endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error;
|
else
|
||||||
|
{
|
||||||
|
detach();
|
||||||
|
cout << "Peer::connected Error: " << error << endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
3
Peer.h
3
Peer.h
@@ -24,7 +24,7 @@ protected:
|
|||||||
std::list<PackedMessage::pointer> mSendQ;
|
std::list<PackedMessage::pointer> mSendQ;
|
||||||
PackedMessage::pointer mSendingPacket;
|
PackedMessage::pointer mSendingPacket;
|
||||||
std::bitset<32> mPeerBits;
|
std::bitset<32> mPeerBits;
|
||||||
uint160 hanko;
|
uint160 mHanko;
|
||||||
|
|
||||||
Peer(boost::asio::io_service& io_service);
|
Peer(boost::asio::io_service& io_service);
|
||||||
|
|
||||||
@@ -76,6 +76,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void connected(const boost::system::error_code& error);
|
void connected(const boost::system::error_code& error);
|
||||||
|
void detach();
|
||||||
|
|
||||||
void sendPacket(PackedMessage::pointer packet);
|
void sendPacket(PackedMessage::pointer packet);
|
||||||
void sendLedgerProposal(Ledger::pointer ledger);
|
void sendLedgerProposal(Ledger::pointer ledger);
|
||||||
|
|||||||
Reference in New Issue
Block a user