Fix crash on bad resolve. Fix peer shutdown logic. Fix peer tracking logic.

This commit is contained in:
JoelKatz
2012-01-19 18:38:31 -08:00
parent 7049d036d9
commit b93613e835
4 changed files with 51 additions and 19 deletions

View File

@@ -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;
} }

View File

@@ -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();

View File

@@ -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
View File

@@ -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);