ZoneCodeGenerator: Fix XAssetList of T6 being loaded into block memory and therefore causing overflows

This commit is contained in:
Jan 2019-11-15 14:50:23 +01:00
parent b15ce90fbb
commit 765b0d9e32
4 changed files with 38 additions and 18 deletions

View File

@ -206,28 +206,28 @@ void ContentLoaderT6::Load(Zone* zone, IZoneInputStream* stream)
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL); m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
auto* assetList = m_stream->Alloc<XAssetList>(alignof(XAssetList)); XAssetList assetList{};
m_stream->Load<XAssetList>(assetList); m_stream->LoadDataRaw(&assetList, sizeof assetList);
varScriptStringList = &assetList->stringList; varScriptStringList = &assetList.stringList;
LoadScriptStringList(false); LoadScriptStringList(false);
if(assetList->depends != nullptr) if(assetList.depends != nullptr)
{ {
assert(assetList->depends == PTR_FOLLOWING); assert(assetList.depends == PTR_FOLLOWING);
assetList->depends = m_stream->Alloc<const char*>(alignof(const char)); assetList.depends = m_stream->Alloc<const char*>(alignof(const char));
varXString = assetList->depends; varXString = assetList.depends;
LoadXStringArray(true, assetList->dependCount); LoadXStringArray(true, assetList.dependCount);
} }
if(assetList->assets != nullptr) if(assetList.assets != nullptr)
{ {
assert(assetList->assets == PTR_FOLLOWING); assert(assetList.assets == PTR_FOLLOWING);
assetList->assets = m_stream->Alloc<XAsset>(alignof(XAsset)); assetList.assets = m_stream->Alloc<XAsset>(alignof(XAsset));
varXAsset = assetList->assets; varXAsset = assetList.assets;
LoadXAssetArray(true, assetList->assetCount); LoadXAssetArray(true, assetList.assetCount);
} }
m_stream->PopBlock(); m_stream->PopBlock();

View File

@ -14,19 +14,21 @@ public:
return static_cast<T*>(Alloc(align)); return static_cast<T*>(Alloc(align));
} }
virtual void LoadData(void* dst, size_t size) = 0; virtual void LoadDataRaw(void* dst, size_t size) = 0;
virtual void LoadDataInBlock(void* dst, size_t size) = 0;
virtual void IncBlockPos(size_t size) = 0;
virtual void LoadNullTerminated(void* dst) = 0; virtual void LoadNullTerminated(void* dst) = 0;
template<typename T> template<typename T>
void Load(T* dst) void Load(T* dst)
{ {
LoadData(dst, sizeof(T)); LoadDataInBlock(const_cast<void*>(reinterpret_cast<const void*>(dst)), sizeof(T));
} }
template<typename T> template<typename T>
void Load(T* dst, const uint32_t count) void Load(T* dst, const uint32_t count)
{ {
LoadData(const_cast<void*>(reinterpret_cast<const void*>(dst)), count * sizeof(T)); LoadDataInBlock(const_cast<void*>(reinterpret_cast<const void*>(dst)), count * sizeof(T));
} }
virtual void** InsertPointer() = 0; virtual void** InsertPointer() = 0;

View File

@ -94,7 +94,12 @@ void* XBlockInputStream::Alloc(const int align)
return &block->m_buffer[m_block_offsets[block->m_index]]; return &block->m_buffer[m_block_offsets[block->m_index]];
} }
void XBlockInputStream::LoadData(void* dst, const size_t size) void XBlockInputStream::LoadDataRaw(void* dst, const size_t size)
{
m_stream->Load(dst, size);
}
void XBlockInputStream::LoadDataInBlock(void* dst, const size_t size)
{ {
assert(!m_block_stack.empty()); assert(!m_block_stack.empty());
@ -118,6 +123,17 @@ void XBlockInputStream::LoadData(void* dst, const size_t size)
m_stream->Load(dst, size); m_stream->Load(dst, size);
IncBlockPos(size);
}
void XBlockInputStream::IncBlockPos(const size_t size)
{
assert(!m_block_stack.empty());
if (m_block_stack.empty())
return;
XBlock* block = m_block_stack.top();
m_block_offsets[block->m_index] += size; m_block_offsets[block->m_index] += size;
} }

View File

@ -30,7 +30,9 @@ public:
void* Alloc(int align) override; void* Alloc(int align) override;
void LoadData(void* dst, size_t size) override; void LoadDataRaw(void* dst, size_t size) override;
void LoadDataInBlock(void* dst, size_t size) override;
void IncBlockPos(size_t size) override;
void LoadNullTerminated(void* dst) override; void LoadNullTerminated(void* dst) override;
void** InsertPointer() override; void** InsertPointer() override;