diff options
author | Andrey Nazarov <skuller@skuller.net> | 2014-11-19 13:57:01 +0300 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2014-12-01 23:04:37 +0300 |
commit | 653d52fdc3c6b9b43ccea234bedb76b12d809db2 (patch) | |
tree | 3ab1eee65a82f47625c3caa556419939c93674b1 | |
parent | e0f92dde25cf56824ea9d2f6ffc47dab4de498d5 (diff) |
Disallow unconnected client commands by default.
Add ‘sv_allow_unconnected_cmds’ console variable to control whether
commands from not fully connected clients are ignored or not.
Fixes #91.
-rw-r--r-- | doc/server.txt | 8 | ||||
-rw-r--r-- | src/server/main.c | 4 | ||||
-rw-r--r-- | src/server/server.h | 2 | ||||
-rw-r--r-- | src/server/user.c | 4 |
4 files changed, 18 insertions, 0 deletions
diff --git a/doc/server.txt b/doc/server.txt index f8b1796..9e1a761 100644 --- a/doc/server.txt +++ b/doc/server.txt @@ -200,6 +200,14 @@ sv_allow_nodelta:: Default value is 1 (don't remove clients), since this may sometimes legitimately happen on very poor client connections. +sv_allow_unconnected_cmds:: + Controls whether client command strings are processed by the game mod even + when the client is not fully spawned in game. Originally, Quake 2 server + forwarded all commands to the game mod even for connecting clients, but + this is known to cause problems with some (broken) mods that don't perform + their own client state checks. Default value is 0 (ignore commands unless + fully connected). + sv_uptime:: Include ‘uptime’ key/value pair in server info. Default value is 0. - 0 — do not display uptime at all diff --git a/src/server/main.c b/src/server/main.c index 468cd39..22c2ee9 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -90,6 +90,8 @@ cvar_t *sv_auth_limit; cvar_t *sv_rcon_limit; cvar_t *sv_namechange_limit; +cvar_t *sv_allow_unconnected_cmds; + cvar_t *g_features; cvar_t *map_override_path; @@ -2137,6 +2139,8 @@ void SV_Init(void) sv_namechange_limit = Cvar_Get("sv_namechange_limit", "5/min", 0); sv_namechange_limit->changed = sv_namechange_limit_changed; + sv_allow_unconnected_cmds = Cvar_Get("sv_allow_unconnected_cmds", "0", 0); + Cvar_Get("sv_features", va("%d", SV_FEATURES), CVAR_ROM); g_features = Cvar_Get("g_features", "0", CVAR_ROM); diff --git a/src/server/server.h b/src/server/server.h index 0919e07..a1e8ced 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -524,6 +524,8 @@ extern cvar_t *sv_auth_limit; extern cvar_t *sv_rcon_limit; extern cvar_t *sv_uptime; +extern cvar_t *sv_allow_unconnected_cmds; + extern cvar_t *g_features; extern cvar_t *map_override_path; diff --git a/src/server/user.c b/src/server/user.c index 8292795..24f6fc4 100644 --- a/src/server/user.c +++ b/src/server/user.c @@ -986,6 +986,10 @@ static void SV_ExecuteUserCommand(const char *s) return; } + if (sv_client->state != cs_spawned && !sv_allow_unconnected_cmds->integer) { + return; + } + LIST_FOR_EACH(filtercmd_t, filter, &sv_filterlist, entry) { if (!Q_stricmp(filter->string, c)) { handle_filtercmd(filter); |