diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 22bd659c60f6031bdb8f29f1fdc0ce3bec6c71a6..1e31de517aa1fcd86f6601271d909afe9df59a62 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -3125,7 +3125,7 @@ static void Command_Ban(void) { if (COM_Argc() < 2) { - CONS_Printf(M_GetText("Ban <playername/playernum> <reason>: ban and kick a player\n")); + CONS_Printf(M_GetText("ban <playername/playernum> <reason>: ban and kick a player\n")); return; } @@ -3149,7 +3149,7 @@ static void Command_Ban(void) if (server && I_Ban && !I_Ban(node)) // only the server is allowed to do this right now { - CONS_Alert(CONS_WARNING, M_GetText("Too many bans! Geez, that's a lot of people you're excluding...\n")); + CONS_Alert(CONS_WARNING, M_GetText("Ban failed. Invalid node?\n")); WRITEUINT8(p, KICK_MSG_GO_AWAY); SendNetXCmd(XD_KICK, &buf, 2); } diff --git a/src/i_tcp.c b/src/i_tcp.c index ba973494fbf82706edafdb40c71568c8b197f9c7..b1a2d30f5b1a56bedcf9bd27e5bf34ff7ed0653a 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -174,8 +174,6 @@ static UINT8 UPNP_support = TRUE; #endif // !NONET -#define MAXBANS 100 - #include "i_system.h" #include "i_net.h" #include "d_net.h" @@ -183,6 +181,7 @@ static UINT8 UPNP_support = TRUE; #include "i_tcp.h" #include "m_argv.h" #include "stun.h" +#include "z_zone.h" #include "doomstat.h" @@ -239,11 +238,13 @@ static mysockaddr_t clientaddress[MAXNETNODES+1]; static mysockaddr_t broadcastaddress[MAXNETNODES+1]; static size_t broadcastaddresses = 0; static boolean nodeconnected[MAXNETNODES+1]; -static mysockaddr_t banned[MAXBANS]; -static UINT8 bannedmask[MAXBANS]; +static mysockaddr_t *banned; +static UINT8 *bannedmask; #endif static size_t numbans = 0; +static size_t banned_size = 0; + static boolean SOCK_bannednode[MAXNETNODES+1]; /// \note do we really need the +1? static boolean init_tcp_driver = false; @@ -1395,6 +1396,39 @@ static boolean SOCK_OpenSocket(void) #endif } +static void AddBannedIndex(void) +{ + if (numbans >= banned_size) + { + if (banned_size == 0) + { + banned_size = 8; + } + else + { + banned_size *= 2; + } + + banned = Z_ReallocAlign( + (void*) banned, + sizeof(mysockaddr_t) * banned_size, + PU_STATIC, + NULL, + sizeof(mysockaddr_t) * 8 + ); + + bannedmask = Z_ReallocAlign( + (void*) banned, + sizeof(UINT8) * banned_size, + PU_STATIC, + NULL, + sizeof(UINT8) * 8 + ); + } + + numbans++; +} + static boolean SOCK_Ban(INT32 node) { if (node > MAXNETNODES) @@ -1402,23 +1436,23 @@ static boolean SOCK_Ban(INT32 node) #ifdef NONET return false; #else - if (numbans == MAXBANS) - return false; - M_Memcpy(&banned[numbans], &clientaddress[node], sizeof (mysockaddr_t)); - if (banned[numbans].any.sa_family == AF_INET) + AddBannedIndex(); + + M_Memcpy(&banned[numbans-1], &clientaddress[node], sizeof (mysockaddr_t)); + if (banned[numbans-1].any.sa_family == AF_INET) { - banned[numbans].ip4.sin_port = 0; - bannedmask[numbans] = 32; + banned[numbans-1].ip4.sin_port = 0; + bannedmask[numbans-1] = 32; } #ifdef HAVE_IPV6 - else if (banned[numbans].any.sa_family == AF_INET6) + else if (banned[numbans-1].any.sa_family == AF_INET6) { - banned[numbans].ip6.sin6_port = 0; - bannedmask[numbans] = 128; + banned[numbans-1].ip6.sin6_port = 0; + bannedmask[numbans-1] = 128; } #endif - numbans++; + return true; #endif } @@ -1433,7 +1467,7 @@ static boolean SOCK_SetBanAddress(const char *address, const char *mask) struct my_addrinfo *ai, *runp, hints; int gaie; - if (numbans == MAXBANS || !address) + if (!address) return false; memset(&hints, 0x00, sizeof(hints)); @@ -1448,26 +1482,27 @@ static boolean SOCK_SetBanAddress(const char *address, const char *mask) runp = ai; - while(runp != NULL && numbans != MAXBANS) + while (runp != NULL) { - memcpy(&banned[numbans], runp->ai_addr, runp->ai_addrlen); + AddBannedIndex(); + + memcpy(&banned[numbans-1], runp->ai_addr, runp->ai_addrlen); if (mask) - bannedmask[numbans] = (UINT8)atoi(mask); + bannedmask[numbans-1] = (UINT8)atoi(mask); #ifdef HAVE_IPV6 else if (runp->ai_family == AF_INET6) - bannedmask[numbans] = 128; + bannedmask[numbans-1] = 128; #endif else - bannedmask[numbans] = 32; + bannedmask[numbans-1] = 32; - if (bannedmask[numbans] > 32 && runp->ai_family == AF_INET) - bannedmask[numbans] = 32; + if (bannedmask[numbans-1] > 32 && runp->ai_family == AF_INET) + bannedmask[numbans-1] = 32; #ifdef HAVE_IPV6 - else if (bannedmask[numbans] > 128 && runp->ai_family == AF_INET6) - bannedmask[numbans] = 128; + else if (bannedmask[numbans-1] > 128 && runp->ai_family == AF_INET6) + bannedmask[numbans-1] = 128; #endif - numbans++; runp = runp->ai_next; } @@ -1480,6 +1515,9 @@ static boolean SOCK_SetBanAddress(const char *address, const char *mask) static void SOCK_ClearBans(void) { numbans = 0; + banned_size = 0; + banned = NULL; + bannedmask = NULL; } boolean I_InitTcpNetwork(void)