Skip to content

Commit

Permalink
Fix server getting completely choked up on even a little of DoS
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
celeron55 committed Aug 4, 2013
1 parent 8831669 commit e6687be
Show file tree
Hide file tree
Showing 4 changed files with 229 additions and 168 deletions.
16 changes: 8 additions & 8 deletions src/connection.cpp
Expand Up @@ -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()
{
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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)
{
Expand Down
2 changes: 1 addition & 1 deletion src/connection.h
Expand Up @@ -281,7 +281,7 @@ class ReliablePacketBuffer
u32 size();
RPBSearchResult findPacket(u16 seqnum);
RPBSearchResult notFound();
u16 getFirstSeqnum();
bool getFirstSeqnum(u16 *result);
BufferedPacket popFirst();
BufferedPacket popSeqnum(u16 seqnum);
void insert(BufferedPacket &p);
Expand Down

0 comments on commit e6687be

Please sign in to comment.