core: Call ConVarQueryFinished on client disconnect (#1384)

* Execute ConVarQueryFinished if client disconnects

So people passing handles to the extra data can close them, adds a new return value to check if this happened

* Update based on suggestion

Co-authored-by: Asher Baker <asherkin@limetech.io>

* Update based on notes

* Normalize

* Pass along cookie handle instead of invalid

Co-authored-by: Asher Baker <asherkin@limetech.io>
This commit is contained in:
Deathreus 2021-03-15 15:44:03 -04:00 committed by GitHub
parent 4dd5ab7576
commit 46c54f829c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 0 deletions

View File

@ -43,6 +43,10 @@ const ParamType CONVARCHANGE_PARAMS[] = {Param_Cell, Param_String, Param_String}
typedef List<const ConVar *> ConVarList; typedef List<const ConVar *> ConVarList;
NameHashSet<ConVarInfo *, ConVarInfo::ConVarPolicy> convar_cache; NameHashSet<ConVarInfo *, ConVarInfo::ConVarPolicy> convar_cache;
enum {
eQueryCvarValueStatus_Cancelled = -1,
};
class ConVarReentrancyGuard class ConVarReentrancyGuard
{ {
ConVar *cvar; ConVar *cvar;
@ -238,6 +242,19 @@ void ConVarManager::OnClientDisconnected(int client)
ConVarQuery &query = (*iter); ConVarQuery &query = (*iter);
if (query.client == client) if (query.client == client)
{ {
IPluginFunction *pCallback = query.pCallback;
if (pCallback)
{
cell_t ret;
pCallback->PushCell(query.cookie);
pCallback->PushCell(client);
pCallback->PushCell(eQueryCvarValueStatus_Cancelled);
pCallback->PushString("");
pCallback->PushString("");
pCallback->PushCell(query.value);
pCallback->Execute(&ret);
}
iter = m_ConVarQueries.erase(iter); iter = m_ConVarQueries.erase(iter);
continue; continue;
} }

View File

@ -49,6 +49,7 @@ enum ConVarBounds
*/ */
enum ConVarQueryResult enum ConVarQueryResult
{ {
ConVarQuery_Cancelled = -1, //< Client disconnected during query */
ConVarQuery_Okay = 0, //< Retrieval of client convar value was successful. */ ConVarQuery_Okay = 0, //< Retrieval of client convar value was successful. */
ConVarQuery_NotFound, //< Client convar was not found. */ ConVarQuery_NotFound, //< Client convar was not found. */
ConVarQuery_NotValid, //< A console command with the same name was found, but there is no convar. */ ConVarQuery_NotValid, //< A console command with the same name was found, but there is no convar. */