Prevent entities being added without a classname
This commit is contained in:
tilgep 2022-09-10 21:18:31 +01:00 committed by GitHub
parent 60d7fad002
commit 83f8b6c21c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,7 +4,7 @@
#include <sourcemod> #include <sourcemod>
#include <regex> #include <regex>
#define PLUGIN_VERSION "1.0.0" #define PLUGIN_VERSION "1.1.0"
public Plugin myinfo = public Plugin myinfo =
{ {
@ -48,6 +48,7 @@ enum struct Block
ArrayList replace; // Modify ArrayList replace; // Modify
ArrayList del; // Modify ArrayList del; // Modify
ArrayList insert; // Add/Modify ArrayList insert; // Add/Modify
bool hasClassname; // Ensures that an add block has a classname set
void Init() void Init()
{ {
@ -61,6 +62,7 @@ enum struct Block
void Clear() void Clear()
{ {
this.hasClassname = false;
this.mode = Mode_None; this.mode = Mode_None;
this.submode = SubMode_None; this.submode = SubMode_None;
this.match.Clear(); this.match.Clear();
@ -70,7 +72,9 @@ enum struct Block
} }
} }
char file[PLATFORM_MAX_PATH];
Block prop; // Global current stripper block Block prop; // Global current stripper block
int section;
public void OnPluginStart() public void OnPluginStart()
{ {
@ -79,18 +83,16 @@ public void OnPluginStart()
public void OnMapInit(const char[] mapName) public void OnMapInit(const char[] mapName)
{ {
char buffer[PLATFORM_MAX_PATH];
// Parse global filters // Parse global filters
BuildPath(Path_SM, buffer, sizeof(buffer), "configs/stripper/global_filters.cfg"); BuildPath(Path_SM, file, sizeof(file), "configs/stripper/global_filters.cfg");
ParseFile(buffer); ParseFile();
// Now parse map config // Now parse map config
strcopy(buffer, sizeof(buffer), mapName); strcopy(file, sizeof(file), mapName);
BuildPath(Path_SM, buffer, sizeof(buffer), "configs/stripper/maps/%s.cfg", buffer); BuildPath(Path_SM, file, sizeof(file), "configs/stripper/maps/%s.cfg", file);
ParseFile(buffer); ParseFile();
} }
/** /**
@ -98,41 +100,58 @@ public void OnMapInit(const char[] mapName)
* *
* @param path Path to parse from * @param path Path to parse from
*/ */
public void ParseFile(char[] path) public void ParseFile()
{ {
char error[128]; char error[128];
int line = 0; int line = 0;
int col = 0; int col = 0;
section = 0;
prop.Clear(); prop.Clear();
SMCParser parser = SMC_CreateParser(); SMCParser parser = SMC_CreateParser();
SMC_SetReaders(parser, Config_NewSection, Config_KeyValue, Config_EndSection); SMC_SetReaders(parser, Config_NewSection, Config_KeyValue, Config_EndSection);
SMCError result = SMC_ParseFile(parser, path, line, col); SMCError result = SMC_ParseFile(parser, file, line, col);
delete parser; delete parser;
if (result != SMCError_Okay) if (result != SMCError_Okay)
{ {
SMC_GetErrorString(result, error, sizeof(error)); SMC_GetErrorString(result, error, sizeof(error));
LogError("%s on line %d, col %d of %s", error, line, col, path); LogError("%s on line %d, col %d of %s", error, line, col, file);
} }
} }
public SMCResult Config_NewSection(SMCParser smc, const char[] name, bool opt_quotes) public SMCResult Config_NewSection(SMCParser smc, const char[] name, bool opt_quotes)
{ {
section++;
if (StrEqual(name, "filter:", false) || StrEqual(name, "remove:", false)) if (StrEqual(name, "filter:", false) || StrEqual(name, "remove:", false))
{ {
if(prop.mode != Mode_None)
{
LogError("Found 'filter' block while inside another block at section %d in file '%s'", section, file);
}
prop.Clear(); prop.Clear();
prop.mode = Mode_Filter; prop.mode = Mode_Filter;
} }
else if (StrEqual(name, "add:", false)) else if (StrEqual(name, "add:", false))
{ {
if(prop.mode != Mode_None)
{
LogError("Found 'add' block while inside another block at section %d in file '%s'", section, file);
}
prop.Clear(); prop.Clear();
prop.mode = Mode_Add; prop.mode = Mode_Add;
} }
else if (StrEqual(name, "modify:", false)) else if (StrEqual(name, "modify:", false))
{ {
if(prop.mode != Mode_None)
{
LogError("Found 'modify' block while inside another block at section %d in file '%s'", section, file);
}
prop.Clear(); prop.Clear();
prop.mode = Mode_Modify; prop.mode = Mode_Modify;
} }
@ -182,6 +201,9 @@ public SMCResult Config_KeyValue(SMCParser smc, const char[] key, const char[] v
} }
case Mode_Add: case Mode_Add:
{ {
// Adding an entity without a classname will crash the server
if(StrEqual(key, "classname", false)) prop.hasClassname = true;
prop.insert.PushArray(kv); prop.insert.PushArray(kv);
} }
case Mode_Modify: case Mode_Modify:
@ -228,7 +250,14 @@ public SMCResult Config_EndSection(SMCParser smc)
{ {
if (prop.insert.Length > 0) if (prop.insert.Length > 0)
{ {
RunAddFilter(); if(prop.hasClassname)
{
RunAddFilter();
}
else
{
LogError("Add block with no classname found at section %d in file '%s'", section, file);
}
} }
prop.mode = Mode_None; prop.mode = Mode_None;