Index: src/server/sv_client.c =================================================================== --- src/server/sv_client.c (revision 1043) +++ src/server/sv_client.c (working copy) @@ -56,8 +56,13 @@ // see if we already have a challenge for this ip challenge = &svs.challenges[0]; for (i = 0 ; i < MAX_CHALLENGES ; i++, challenge++) { - if ( !challenge->connected && NET_CompareAdr( from, challenge->adr ) ) { - break; + if ( NET_CompareAdr( from, challenge->adr ) ) { + if ( !challenge->connected ) + break; + else if ( challenge->inuse ) { + NET_OutOfBandPrint( NS_SERVER, from, "challengeResponse %i", challenge->challenge ); + return; + } } if ( challenge->time < oldestTime ) { oldestTime = challenge->time; @@ -74,6 +79,7 @@ challenge->firstTime = svs.time; challenge->time = svs.time; challenge->connected = qfalse; + challenge->inuse = qtrue; i = oldest; } @@ -341,6 +347,7 @@ for (i = 0 ; i < MAX_CHALLENGES ; i++, challenge++) { if ( NET_CompareAdr( drop->netchan.remoteAddress, challenge->adr ) ) { challenge->connected = qfalse; + challenge->inuse = qfalse; break; } } Index: src/server/server.h =================================================================== --- src/server/server.h (revision 1043) +++ src/server/server.h (working copy) @@ -189,6 +189,7 @@ int pingTime; // time the challenge response was sent to client int firstTime; // time the adr was first used, for authorize timeout checks qboolean connected; + qboolean inuse; } challenge_t;