mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-22 00:55:45 +00:00
ZoneCodeGenerator: Fix XAssetList of T6 being loaded into block memory and therefore causing overflows
This commit is contained in:
parent
b15ce90fbb
commit
765b0d9e32
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user