Core/Housing: harden isolated DB2 record-size validation

This commit is contained in:
Gexo91
2026-09-12 01:11:31 +03:00
committed by GitHub
parent 9222140b6a
commit 1b62dbd3d2
+40 -3
View File
@@ -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);