Block attempts to connect to the client (#10589)

A Minetest peer initiates a connection by sending a packet with an invalid peer_id, for whatever reason the code for doing this ran on both the client and the server meaning you could connect to a client if you knew what the address:port tuple it was listening on.
This commit is contained in:
red-001 2020-11-02 21:21:03 +00:00 committed by GitHub
parent 9c9344ceb3
commit 0abb3e89fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 2 deletions

@ -1566,7 +1566,7 @@ void Connection::sendAck(session_t peer_id, u8 channelnum, u16 seqnum)
UDPPeer* Connection::createServerPeer(Address& address) UDPPeer* Connection::createServerPeer(Address& address)
{ {
if (getPeerNoEx(PEER_ID_SERVER) != 0) if (ConnectedToServer())
{ {
throw ConnectionException("Already connected to a server"); throw ConnectionException("Already connected to a server");
} }

@ -809,6 +809,11 @@ protected:
void putEvent(ConnectionEvent &e); void putEvent(ConnectionEvent &e);
void TriggerSend(); void TriggerSend();
bool ConnectedToServer()
{
return getPeerNoEx(PEER_ID_SERVER) != nullptr;
}
private: private:
MutexedQueue<ConnectionEvent> m_event_queue; MutexedQueue<ConnectionEvent> m_event_queue;

@ -956,8 +956,11 @@ void ConnectionReceiveThread::receive(SharedBuffer<u8> &packetdata,
// command was sent reliably. // command was sent reliably.
} }
/* The peer was not found in our lists. Add it. */
if (peer_id == PEER_ID_INEXISTENT) { if (peer_id == PEER_ID_INEXISTENT) {
/* Ignore it if we are a client */
if (m_connection->ConnectedToServer())
return;
/* The peer was not found in our lists. Add it. */
peer_id = m_connection->createPeer(sender, MTP_MINETEST_RELIABLE_UDP, 0); peer_id = m_connection->createPeer(sender, MTP_MINETEST_RELIABLE_UDP, 0);
} }