Fixed race condition where client cookie callbacks could be fired against wrong clients (bug 3375).

This commit is contained in:
David Anderson 2008-10-31 08:28:08 -05:00
parent 8d78c74554
commit 3c18289465
4 changed files with 25 additions and 10 deletions

View File

@ -196,9 +196,16 @@ bool CookieManager::SetCookieValue(Cookie *pCookie, int client, char *value)
void CookieManager::OnClientAuthorized(int client, const char *authstring)
{
IGamePlayer *player = playerhelpers->GetGamePlayer(client);
if (player == NULL)
{
return;
}
connected[client] = true;
TQueryOp *op = new TQueryOp(Query_SelectData, client);
TQueryOp *op = new TQueryOp(Query_SelectData, player->GetUserId());
strcpy(op->m_params.steamId, authstring);
g_ClientPrefs.AddQueryToQueue(op);
@ -261,10 +268,18 @@ void CookieManager::OnClientDisconnecting(int client)
}
}
void CookieManager::ClientConnectCallback(int client, IQuery *data)
void CookieManager::ClientConnectCallback(int userid, IQuery *data)
{
int client;
IResultSet *results;
/* Check validity of client */
if ((client = playerhelpers->GetClientOfUserId(userid)) == 0)
{
return;
}
/* Check validity of results */
if (data == NULL || (results = data->GetResultSet()) == NULL)
{
return;

View File

@ -121,7 +121,7 @@ public:
void Unload();
void ClientConnectCallback(int client, IQuery *data);
void ClientConnectCallback(int userid, IQuery *data);
void InsertCookieCallback(Cookie *pCookie, int dbId);
void SelectIdCallback(Cookie *pCookie, IQuery *data);

View File

@ -51,7 +51,7 @@ void TQueryOp::RunThinkPart()
case Query_SelectData:
{
g_CookieManager.ClientConnectCallback(m_client, m_pResult);
g_CookieManager.ClientConnectCallback(m_userid, m_pResult);
break;
}
@ -84,10 +84,10 @@ void TQueryOp::RunThreadPart()
if (!BindParamsAndRun())
{
g_pSM->LogError(myself,
"Failed SQL Query, Error: \"%s\" (Query id %i - client %i)",
"Failed SQL Query, Error: \"%s\" (Query id %i - userid %i)",
m_database->GetError(),
m_type,
m_client);
m_userid);
}
m_database->UnlockFromFullAtomicOperation();
@ -115,10 +115,10 @@ void TQueryOp::Destroy()
delete this;
}
TQueryOp::TQueryOp(enum querytype type, int client)
TQueryOp::TQueryOp(enum querytype type, int userid)
{
m_type = type;
m_client = client;
m_userid = userid;
m_database = NULL;
m_insertId = -1;
m_pResult = NULL;

View File

@ -68,7 +68,7 @@ struct ParamData
class TQueryOp : public IDBThreadOperation
{
public:
TQueryOp(enum querytype type, int client);
TQueryOp(enum querytype type, int userid);
TQueryOp(enum querytype type, Cookie *cookie);
~TQueryOp() {}
@ -102,7 +102,7 @@ private:
enum querytype m_type;
/* Data to be passed to the callback */
int m_client;
int m_userid;
int m_insertId;
Cookie *m_pCookie;
};