mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Fix server getting completely choked up on even a little of DoS
* If client count is unbearable, immediately delete denied clients * Re-prioritize the checking order of things about incoming clients * Remove a huge CPU-wasting exception in ReliablePacketBuffer
This commit is contained in:
parent
8831669505
commit
e6687be493
4 changed files with 229 additions and 168 deletions
|
@ -207,12 +207,13 @@ RPBSearchResult ReliablePacketBuffer::notFound()
|
|||
{
|
||||
return m_list.end();
|
||||
}
|
||||
u16 ReliablePacketBuffer::getFirstSeqnum()
|
||||
bool ReliablePacketBuffer::getFirstSeqnum(u16 *result)
|
||||
{
|
||||
if(empty())
|
||||
throw NotFoundException("Buffer is empty");
|
||||
return false;
|
||||
BufferedPacket p = *m_list.begin();
|
||||
return readU16(&p.data[BASE_HEADER_SIZE+1]);
|
||||
*result = readU16(&p.data[BASE_HEADER_SIZE+1]);
|
||||
return true;
|
||||
}
|
||||
BufferedPacket ReliablePacketBuffer::popFirst()
|
||||
{
|
||||
|
@ -700,7 +701,7 @@ void Connection::receive()
|
|||
|
||||
bool single_wait_done = false;
|
||||
|
||||
for(;;)
|
||||
for(u32 loop_i=0; loop_i<1000; loop_i++) // Limit in case of DoS
|
||||
{
|
||||
try{
|
||||
/* Check if some buffer has relevant data */
|
||||
|
@ -1245,17 +1246,16 @@ bool Connection::checkIncomingBuffers(Channel *channel, u16 &peer_id,
|
|||
{
|
||||
u16 firstseqnum = 0;
|
||||
// Clear old packets from start of buffer
|
||||
try{
|
||||
for(;;){
|
||||
firstseqnum = channel->incoming_reliables.getFirstSeqnum();
|
||||
bool found = channel->incoming_reliables.getFirstSeqnum(&firstseqnum);
|
||||
if(!found)
|
||||
break;
|
||||
if(seqnum_higher(channel->next_incoming_seqnum, firstseqnum))
|
||||
channel->incoming_reliables.popFirst();
|
||||
else
|
||||
break;
|
||||
}
|
||||
// This happens if all packets are old
|
||||
}catch(con::NotFoundException)
|
||||
{}
|
||||
|
||||
if(channel->incoming_reliables.empty() == false)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue