From cd93106c19fdb9303d9520fdd473a5a7287923aa Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 15 Nov 2019 14:52:53 +0100 Subject: [PATCH] ZoneCodeGenerator: Fix fastfile offsets being wrong by 1 due to not respecting that all offsets are moved by 1 --- .../Zone/Stream/Impl/XBlockInputStream.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp b/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp index 735ae757..457e0559 100644 --- a/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp +++ b/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp @@ -191,8 +191,12 @@ void** XBlockInputStream::InsertPointer() void* XBlockInputStream::ConvertOffsetToPointer(const void* offset) { - const block_t blockNum = reinterpret_cast(offset) >> (sizeof(offset) * 8 - m_block_bit_count); - const size_t blockOffset = reinterpret_cast(offset) & (UINTPTR_MAX >> m_block_bit_count); + // -1 because otherwise Block 0 Offset 0 would be just 0 which is already used to signalize a nullptr. + // So all offsets are moved by 1. + auto offsetInt = reinterpret_cast(offset) - 1; + + const block_t blockNum = offsetInt >> (sizeof(offsetInt) * 8 - m_block_bit_count); + const size_t blockOffset = offsetInt & (UINTPTR_MAX >> m_block_bit_count); if(blockNum < 0 || blockNum >= static_cast(m_blocks.size())) { @@ -211,8 +215,11 @@ void* XBlockInputStream::ConvertOffsetToPointer(const void* offset) void* XBlockInputStream::ConvertOffsetToAlias(const void* offset) { - const block_t blockNum = reinterpret_cast(offset) >> (sizeof(offset) * 8 - m_block_bit_count); - const size_t blockOffset = reinterpret_cast(offset) & (UINTPTR_MAX >> m_block_bit_count); + // For details see ConvertOffsetToPointer + auto offsetInt = reinterpret_cast(offset) - 1; + + const block_t blockNum = offsetInt >> (sizeof(offsetInt) * 8 - m_block_bit_count); + const size_t blockOffset = offsetInt & (UINTPTR_MAX >> m_block_bit_count); if(blockNum < 0 || blockNum >= static_cast(m_blocks.size())) {