diff options
Diffstat (limited to 'src/server')
| -rwxr-xr-x | src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp | 15 | ||||
| -rwxr-xr-x | src/server/game/Server/WorldSession.cpp | 9 | ||||
| -rwxr-xr-x | src/server/game/Server/WorldSession.h | 1 | 
3 files changed, 24 insertions, 1 deletions
| diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp index 1dd18d9c2f1..9e25f686c3f 100755 --- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp @@ -445,7 +445,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                  Field *fields = result->Fetch();                  // SELECT SUM(x) is MYSQL_TYPE_NEWDECIMAL - needs to be read as string                  const char* ch = fields[0].GetCString(); -                acctCharCount = atoi(ch); +                if (ch) +                    acctCharCount = atoi(ch);              }              if (acctCharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_ACCOUNT)) @@ -454,6 +455,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                  data << uint8(CHAR_CREATE_ACCOUNT_LIMIT);                  SendPacket(&data);                  delete createInfo; +                _charCreateCallback.SetParam(NULL);                  _charCreateCallback.FreeResult();                  return;              } @@ -483,6 +485,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                      data << uint8(CHAR_CREATE_SERVER_LIMIT);                      SendPacket(&data);                      delete createInfo; +                    _charCreateCallback.SetParam(NULL);                      _charCreateCallback.FreeResult();                      return;                  } @@ -500,6 +503,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                  data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT);                  SendPacket(&data);                  delete createInfo; +                _charCreateCallback.SetParam(NULL);                  _charCreateCallback.FreeResult();                  return;              } @@ -550,6 +554,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                              data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);                              SendPacket(&data);                              delete createInfo; +                            _charCreateCallback.SetParam(NULL); +                            _charCreateCallback.FreeResult();                              return;                          }                      } @@ -576,6 +582,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                          data << uint8(CHAR_CREATE_PVP_TEAMS_VIOLATION);                          SendPacket(&data);                          delete createInfo; +                        _charCreateCallback.SetParam(NULL); +                        _charCreateCallback.FreeResult();                          return;                      }                  } @@ -607,6 +615,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                                  data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);                                  SendPacket(&data);                                  delete createInfo; +                                _charCreateCallback.SetParam(NULL); +                                _charCreateCallback.FreeResult();                                  return;                              }                          } @@ -639,6 +649,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte                  data << uint8(CHAR_CREATE_ERROR);                  SendPacket(&data);                  delete createInfo; +                _charCreateCallback.SetParam(NULL); +                _charCreateCallback.FreeResult();                  return;              } @@ -679,6 +691,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte              delete pNewChar;                                        // created only to call SaveToDB()              delete createInfo; +            _charCreateCallback.SetParam(NULL);              _charCreateCallback.FreeResult();          }          break; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index f689e0c3266..e9f5573c723 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -102,6 +102,8 @@ m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter)          ResetTimeOutTime();          LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId());      } + +    InitializeQueryCallbackParameters();  }  /// WorldSession destructor @@ -940,6 +942,13 @@ void WorldSession::SetPlayer(Player *plr)          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()  {      QueryResult result; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 7e443d299c2..aa7793a69ff 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -893,6 +893,7 @@ class WorldSession          void HandleUpdateProjectilePosition(WorldPacket& recvPacket);      private: +        void InitializeQueryCallbackParameters();          void ProcessQueryCallbacks();          ACE_Future_Set<QueryResult> _nameQueryCallbacks; | 
