Core/DBLayer: Fix possible crashes from fe8cb7
This commit is contained in:
@@ -445,7 +445,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
Field *fields = result->Fetch();
|
Field *fields = result->Fetch();
|
||||||
// SELECT SUM(x) is MYSQL_TYPE_NEWDECIMAL - needs to be read as string
|
// SELECT SUM(x) is MYSQL_TYPE_NEWDECIMAL - needs to be read as string
|
||||||
const char* ch = fields[0].GetCString();
|
const char* ch = fields[0].GetCString();
|
||||||
acctCharCount = atoi(ch);
|
if (ch)
|
||||||
|
acctCharCount = atoi(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (acctCharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_ACCOUNT))
|
if (acctCharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_ACCOUNT))
|
||||||
@@ -454,6 +455,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_ACCOUNT_LIMIT);
|
data << uint8(CHAR_CREATE_ACCOUNT_LIMIT);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
_charCreateCallback.FreeResult();
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -483,6 +485,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_SERVER_LIMIT);
|
data << uint8(CHAR_CREATE_SERVER_LIMIT);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
_charCreateCallback.FreeResult();
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -500,6 +503,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT);
|
data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
_charCreateCallback.FreeResult();
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -550,6 +554,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
|
data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -576,6 +582,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_PVP_TEAMS_VIOLATION);
|
data << uint8(CHAR_CREATE_PVP_TEAMS_VIOLATION);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -607,6 +615,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
|
data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -639,6 +649,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
data << uint8(CHAR_CREATE_ERROR);
|
data << uint8(CHAR_CREATE_ERROR);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
|
_charCreateCallback.FreeResult();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -679,6 +691,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
|
|||||||
|
|
||||||
delete pNewChar; // created only to call SaveToDB()
|
delete pNewChar; // created only to call SaveToDB()
|
||||||
delete createInfo;
|
delete createInfo;
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
_charCreateCallback.FreeResult();
|
_charCreateCallback.FreeResult();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -102,6 +102,8 @@ m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter)
|
|||||||
ResetTimeOutTime();
|
ResetTimeOutTime();
|
||||||
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId());
|
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InitializeQueryCallbackParameters();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// WorldSession destructor
|
/// WorldSession destructor
|
||||||
@@ -940,6 +942,13 @@ void WorldSession::SetPlayer(Player *plr)
|
|||||||
m_GUIDLow = _player->GetGUIDLow();
|
m_GUIDLow = _player->GetGUIDLow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldSession::InitializeQueryCallbackParameters()
|
||||||
|
{
|
||||||
|
// Callback parameters that have pointers in them should be properly
|
||||||
|
// initialized to NULL here.
|
||||||
|
_charCreateCallback.SetParam(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void WorldSession::ProcessQueryCallbacks()
|
void WorldSession::ProcessQueryCallbacks()
|
||||||
{
|
{
|
||||||
QueryResult result;
|
QueryResult result;
|
||||||
|
|||||||
@@ -893,6 +893,7 @@ class WorldSession
|
|||||||
void HandleUpdateProjectilePosition(WorldPacket& recvPacket);
|
void HandleUpdateProjectilePosition(WorldPacket& recvPacket);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void InitializeQueryCallbackParameters();
|
||||||
void ProcessQueryCallbacks();
|
void ProcessQueryCallbacks();
|
||||||
|
|
||||||
ACE_Future_Set<QueryResult> _nameQueryCallbacks;
|
ACE_Future_Set<QueryResult> _nameQueryCallbacks;
|
||||||
|
|||||||
Reference in New Issue
Block a user