Core/Housing: harden isolated DB2 record-size validation
This commit is contained in:
@@ -8,7 +8,6 @@
|
|||||||
#include "DB2Store.h"
|
#include "DB2Store.h"
|
||||||
#include "HotfixDatabase.h"
|
#include "HotfixDatabase.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "SharedDefines.h"
|
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@@ -20,7 +19,9 @@ namespace Housing::ClientData
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
constexpr uint32 HouseRoomFileDataId69587 = 5163003;
|
||||||
constexpr uint32 HouseRoomLayoutHash69587 = 0xF04DC279;
|
constexpr uint32 HouseRoomLayoutHash69587 = 0xF04DC279;
|
||||||
|
constexpr uint32 HouseLevelDataFileDataId69587 = 7149539;
|
||||||
constexpr uint32 HouseLevelDataLayoutHash69587 = 0xF8146F9D;
|
constexpr uint32 HouseLevelDataLayoutHash69587 = 0xF8146F9D;
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
@@ -78,7 +79,7 @@ namespace Housing::ClientData
|
|||||||
constexpr DB2LoadInfo HouseRoomLoadInfo69587
|
constexpr DB2LoadInfo HouseRoomLoadInfo69587
|
||||||
{
|
{
|
||||||
HouseRoomFields69587,
|
HouseRoomFields69587,
|
||||||
std::size(HouseRoomFields69587),
|
10,
|
||||||
&HouseRoomMeta::Instance,
|
&HouseRoomMeta::Instance,
|
||||||
HOTFIX_SEL_HOUSE_ROOM
|
HOTFIX_SEL_HOUSE_ROOM
|
||||||
};
|
};
|
||||||
@@ -86,7 +87,7 @@ namespace Housing::ClientData
|
|||||||
constexpr DB2LoadInfo HouseLevelDataLoadInfo69587
|
constexpr DB2LoadInfo HouseLevelDataLoadInfo69587
|
||||||
{
|
{
|
||||||
HouseLevelDataFields69587,
|
HouseLevelDataFields69587,
|
||||||
std::size(HouseLevelDataFields69587),
|
4,
|
||||||
&HouseLevelDataMeta::Instance,
|
&HouseLevelDataMeta::Instance,
|
||||||
HOTFIX_SEL_HOUSE_LEVEL_DATA
|
HOTFIX_SEL_HOUSE_LEVEL_DATA
|
||||||
};
|
};
|
||||||
@@ -140,6 +141,33 @@ namespace Housing::ClientData
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HasExpectedGeneratedMetadata()
|
||||||
|
{
|
||||||
|
bool const roomMetaValid =
|
||||||
|
HouseRoomMeta::Instance.FileDataId == HouseRoomFileDataId69587 &&
|
||||||
|
HouseRoomMeta::Instance.LayoutHash == HouseRoomLayoutHash69587 &&
|
||||||
|
HouseRoomMeta::Instance.FieldCount == 10 &&
|
||||||
|
HouseRoomMeta::Instance.FileFieldCount == 10 &&
|
||||||
|
HouseRoomMeta::Instance.GetRecordSize() == sizeof(HouseRoomRecord69587);
|
||||||
|
|
||||||
|
bool const levelMetaValid =
|
||||||
|
HouseLevelDataMeta::Instance.FileDataId == HouseLevelDataFileDataId69587 &&
|
||||||
|
HouseLevelDataMeta::Instance.LayoutHash == HouseLevelDataLayoutHash69587 &&
|
||||||
|
HouseLevelDataMeta::Instance.FieldCount == 4 &&
|
||||||
|
HouseLevelDataMeta::Instance.FileFieldCount == 4 &&
|
||||||
|
HouseLevelDataMeta::Instance.GetRecordSize() == sizeof(HouseLevelDataRecord69587);
|
||||||
|
|
||||||
|
if (!roomMetaValid || !levelMetaValid)
|
||||||
|
{
|
||||||
|
TC_LOG_ERROR("housing",
|
||||||
|
"Housing 69587 client-data metadata guard failed (HouseRoom={}, HouseLevelData={}); room templates remain disabled",
|
||||||
|
roomMetaValid, levelMetaValid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void EnsureLoaded()
|
void EnsureLoaded()
|
||||||
{
|
{
|
||||||
HousingClientDataStores& stores = GetStores();
|
HousingClientDataStores& stores = GetStores();
|
||||||
@@ -149,7 +177,16 @@ namespace Housing::ClientData
|
|||||||
|
|
||||||
stores.LoadAttempted = true;
|
stores.LoadAttempted = true;
|
||||||
|
|
||||||
|
if (!HasExpectedGeneratedMetadata())
|
||||||
|
return;
|
||||||
|
|
||||||
LocaleConstant const locale = sWorld->GetDefaultDbcLocale();
|
LocaleConstant const locale = sWorld->GetDefaultDbcLocale();
|
||||||
|
if (!IsValidLocale(locale))
|
||||||
|
{
|
||||||
|
TC_LOG_ERROR("housing", "Housing client-data cannot load with invalid DBC locale {}", uint32(locale));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::string const path = sWorld->GetDataPath() + "dbc/" + localeNames[locale] + '/';
|
std::string const path = sWorld->GetDataPath() + "dbc/" + localeNames[locale] + '/';
|
||||||
|
|
||||||
stores.RoomReady = LoadVerifiedStore(stores.RoomStore, path, locale, HouseRoomLayoutHash69587);
|
stores.RoomReady = LoadVerifiedStore(stores.RoomStore, path, locale, HouseRoomLayoutHash69587);
|
||||||
|
|||||||
Reference in New Issue
Block a user