From 4da5a397b5994bfe5fddb9dad35bef5ddbea64c9 Mon Sep 17 00:00:00 2001 From: jackeri Date: Mon, 29 Dec 2014 19:40:04 +0200 Subject: [PATCH] server: possibly fixed sv_protect 1 and added chanllenge size check (Ensiform), refs #541 --- src/server/server.h | 6 ++++++ src/server/sv_main.c | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/server/server.h b/src/server/server.h index 03e8c8d27..96b323e30 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -507,6 +507,12 @@ void SV_ChangeMaxClients(void); void SV_SpawnServer(char *server); void SV_WriteAttackLog(const char *log); +#ifdef LEGACY_DEBUG +#define SV_WriteAttackLogD(x) SV_WriteAttackLog(x) +#else +#define SV_WriteAttackLogD(x) +#endif + // sv_client.c void SV_GetChallenge(netadr_t from); void SV_DirectConnect(netadr_t from); diff --git a/src/server/sv_main.c b/src/server/sv_main.c index d7d795448..ed0d0348b 100644 --- a/src/server/sv_main.c +++ b/src/server/sv_main.c @@ -594,6 +594,9 @@ static leakyBucket_t *SVC_BucketForAddress(netadr_t address, int burst, int peri } // Couldn't allocate a bucket for this address + // Write the info to the attack log since this is relevant information as the system is malfunctioning + SV_WriteAttackLogD(va("SVC_BucketForAddress: Could not allocate a bucket for client from %s\n", NET_AdrToString(address))); + return NULL; } @@ -609,7 +612,7 @@ qboolean SVC_RateLimit(leakyBucket_t *bucket, int burst, int period) int expired = interval / period; int expiredRemainder = interval % period; - if (expired > bucket->burst) + if (expired > bucket->burst || interval < 0) { bucket->burst = 0; bucket->lastTime = now; @@ -623,9 +626,12 @@ qboolean SVC_RateLimit(leakyBucket_t *bucket, int burst, int period) if (bucket->burst < burst) { bucket->burst++; - return qfalse; } + else + { + SV_WriteAttackLogD(va("SVC_RateLimit: burst limit exceeded for bucket: %i limit: %i\n", bucket->burst, burst)); + } } return qtrue; @@ -678,6 +684,12 @@ static void SVC_Status(netadr_t from, qboolean force) } } + // A maximum challenge length of 128 should be more than plenty. + if (strlen(Cmd_Argv(1)) > 128) + { + return; + } + strcpy(infostring, Cvar_InfoString(CVAR_SERVERINFO | CVAR_SERVERINFO_NOUPDATE)); // echo back the parameter to status. so master servers can use it as a challenge @@ -1043,7 +1055,7 @@ static void SV_ConnectionlessPacket(netadr_t from, msg_t *msg) Com_DPrintf("SV packet %s : %s\n", NET_AdrToString(from), c); if (!Q_stricmp(c, "getstatus")) - { + { if ((sv_protect->integer & SVP_OWOLF) && SV_CheckDRDoS(from)) { return;