aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrueter <swurl@swurl.xyz>2025-06-10 21:03:57 +0000
committercrueter <crueter@noreply.localhost>2025-06-10 21:03:57 +0000
commitc6a87a661a7fed4370d275f3e700b6234f6d03a3 (patch)
tree6212ec13c33ca57d6d6e43f18a54b1123216e7fc /src
parent5b361338c1e08b53a06acacc7c7f4b70ffbc4755 (diff)
fix integrity store crash on new updates (#177)
credit: Zeuslota Signed-off-by: crueter <swurl@swurl.xyz> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/177 Co-authored-by: crueter <swurl@swurl.xyz> Co-committed-by: crueter <swurl@swurl.xyz>
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp
index 2f73abf86a..046571e9ef 100644
--- a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp
+++ b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp
@@ -1,18 +1,26 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include "common/alignment.h"
#include "core/file_sys/fssystem/fssystem_integrity_verification_storage.h"
+#include "common/alignment.h"
namespace FileSys {
-constexpr inline u32 ILog2(u32 val) {
+constexpr inline u32 ILog2(u32 val)
+{
ASSERT(val > 0);
return static_cast<u32>((sizeof(u32) * 8) - 1 - std::countl_zero<u32>(val));
}
-void IntegrityVerificationStorage::Initialize(VirtualFile hs, VirtualFile ds, s64 verif_block_size,
- s64 upper_layer_verif_block_size, bool is_real_data) {
+void IntegrityVerificationStorage::Initialize(VirtualFile hs,
+ VirtualFile ds,
+ s64 verif_block_size,
+ s64 upper_layer_verif_block_size,
+ bool is_real_data)
+{
// Validate preconditions.
ASSERT(verif_block_size >= HashSize);
@@ -32,22 +40,28 @@ void IntegrityVerificationStorage::Initialize(VirtualFile hs, VirtualFile ds, s6
ASSERT(m_upper_layer_verification_block_size == 1ll << m_upper_layer_verification_block_order);
// Validate sizes.
- {
+ if (m_data_storage != nullptr) {
s64 hash_size = m_hash_storage->GetSize();
s64 data_size = m_data_storage->GetSize();
ASSERT(((hash_size / HashSize) * m_verification_block_size) >= data_size);
+ } else {
+ LOG_ERROR(Loader,
+ "Failed to initialize integrity verification store. Game, update, or DLC may not "
+ "work.");
}
// Set data.
m_is_real_data = is_real_data;
}
-void IntegrityVerificationStorage::Finalize() {
+void IntegrityVerificationStorage::Finalize()
+{
m_hash_storage = VirtualFile();
m_data_storage = VirtualFile();
}
-size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset) const {
+size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset) const
+{
// Succeed if zero size.
if (size == 0) {
return size;
@@ -56,7 +70,13 @@ size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset
// Validate arguments.
ASSERT(buffer != nullptr);
- // Validate the offset.
+ if (m_data_storage == nullptr) {
+ LOG_ERROR(Loader,
+ "Integrity verification store failed read operation. Game, update or DLC may not "
+ "work.");
+ return 0;
+ }
+
s64 data_size = m_data_storage->GetSize();
ASSERT(offset <= static_cast<size_t>(data_size));
@@ -84,7 +104,8 @@ size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset
return m_data_storage->Read(buffer, read_size, offset);
}
-size_t IntegrityVerificationStorage::GetSize() const {
+size_t IntegrityVerificationStorage::GetSize() const
+{
return m_data_storage->GetSize();
}