Core/DBLayer: Fix possible crashes from fe8cb7

This commit is contained in:
Machiavelli
2011-06-22 18:04:12 +02:00
parent 41254653a2
commit 9b17b9c3ba
3 changed files with 24 additions and 1 deletions
@@ -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;
+9
View File
@@ -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;
+1
View File
@@ -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;