summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2014-11-19 13:57:01 +0300
committerAndrey Nazarov <skuller@skuller.net>2014-12-01 23:04:37 +0300
commit653d52fdc3c6b9b43ccea234bedb76b12d809db2 (patch)
tree3ab1eee65a82f47625c3caa556419939c93674b1
parente0f92dde25cf56824ea9d2f6ffc47dab4de498d5 (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.txt8
-rw-r--r--src/server/main.c4
-rw-r--r--src/server/server.h2
-rw-r--r--src/server/user.c4
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);