fixed amb834 - command callbacks could potentially occur on invalid clients in very rare cases

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401375
This commit is contained in:
David Anderson 2007-08-26 17:41:02 +00:00
parent b85f2c625c
commit 294d6b9f8f
2 changed files with 25 additions and 8 deletions

View File

@ -203,6 +203,17 @@ ResultType ConCmdManager::DispatchClientCommand(int client, const char *cmd, int
void ConCmdManager::InternalDispatch()
{
int client = m_CmdClient;
if (client)
{
CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
if (!pPlayer || !pPlayer->IsConnected())
{
return;
}
}
/**
* Note: Console commands will EITHER go through IServerGameDLL::ClientCommand,
* OR this dispatch. They will NEVER go through both.
@ -225,7 +236,7 @@ void ConCmdManager::InternalDispatch()
CmdHook *pHook;
/* Execute server-only commands if viable */
if (m_CmdClient == 0 && pInfo->srvhooks.size())
if (client == 0 && pInfo->srvhooks.size())
{
cell_t tempres = result;
for (iter=pInfo->srvhooks.begin();
@ -275,9 +286,9 @@ void ConCmdManager::InternalDispatch()
{
continue;
}
if (m_CmdClient
if (client
&& pHook->pAdmin
&& !CheckAccess(m_CmdClient, cmd, pHook->pAdmin))
&& !CheckAccess(client, cmd, pHook->pAdmin))
{
if (result < Pl_Handled)
{
@ -289,11 +300,11 @@ void ConCmdManager::InternalDispatch()
/* On a listen server, sometimes the server host's client index can be set as 0.
* So index 1 is passed to the command callback to correct this potential problem.
*/
if (m_CmdClient == 0 && !engine->IsDedicatedServer())
if (client == 0 && !engine->IsDedicatedServer())
{
pHook->pf->PushCell(1);
} else {
pHook->pf->PushCell(m_CmdClient);
pHook->pf->PushCell(client);
}
pHook->pf->PushCell(args);

View File

@ -549,6 +549,15 @@ void PlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
void PlayerManager::OnClientCommand(edict_t *pEntity)
{
int client = engine->IndexOfEdict(pEntity);
cell_t res = Pl_Continue;
CPlayer *pPlayer = GetPlayerByIndex(client);
if (!pPlayer || !pPlayer->IsConnected())
{
return;
}
/**
* We cache this because the engine is not re-entrant.
*/
@ -556,9 +565,6 @@ void PlayerManager::OnClientCommand(edict_t *pEntity)
int args = engine->Cmd_Argc() - 1;
strncopy(cmd, engine->Cmd_Argv(0), sizeof(cmd));
int client = engine->IndexOfEdict(pEntity);
cell_t res = Pl_Continue;
bool result = g_ValveMenuStyle.OnClientCommand(client, cmd);
if (result)
{