summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO
diff options
context:
space:
mode:
authorTilka <tilkax@gmail.com>2020-01-25 21:07:01 +0000
committerGitHub <noreply@github.com>2020-01-25 21:07:01 +0000
commit14ebdf0e9da81eb0c8dbb7f8a86a482028bf7f63 (patch)
treec8990c515e844021a182d9a45ca0b2345d2f1b94 /Source/Core/DiscIO
parentb0e040431a633ea3b0486673592e0de753110823 (diff)
parentde26fec0af2d3bfebc45691ddab639d99757b0a8 (diff)
Merge pull request #8585 from JosJuice/volumeverifier-read-error
VolumeVerifier: Report read errors to the user
Diffstat (limited to 'Source/Core/DiscIO')
-rw-r--r--Source/Core/DiscIO/VolumeVerifier.cpp53
-rw-r--r--Source/Core/DiscIO/VolumeVerifier.h2
2 files changed, 31 insertions, 24 deletions
diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp
index b6b7ea4901..b868861fd1 100644
--- a/Source/Core/DiscIO/VolumeVerifier.cpp
+++ b/Source/Core/DiscIO/VolumeVerifier.cpp
@@ -1114,36 +1114,38 @@ void VolumeVerifier::Process()
const bool is_data_needed = m_calculating_any_hash || content_read || block_read;
const bool read_succeeded = is_data_needed && ReadChunkAndWaitForAsyncOperations(bytes_to_read);
+ if (!read_succeeded)
+ {
+ ERROR_LOG(DISCIO, "Read failed at 0x%" PRIx64 " to 0x%" PRIx64, m_progress,
+ m_progress + bytes_to_read);
+
+ m_read_errors_occurred = true;
+ m_calculating_any_hash = false;
+ }
+
if (m_calculating_any_hash)
{
- if (!read_succeeded)
+ if (m_hashes_to_calculate.crc32)
{
- m_calculating_any_hash = false;
+ m_crc32_future = std::async(std::launch::async, [this] {
+ // It would be nice to use crc32_z here instead of crc32, but it isn't available on Android
+ m_crc32_context =
+ crc32(m_crc32_context, m_data.data(), static_cast<unsigned int>(m_data.size()));
+ });
}
- else
- {
- if (m_hashes_to_calculate.crc32)
- {
- m_crc32_future = std::async(std::launch::async, [this] {
- // Would be nice to use crc32_z here instead of crc32, but it isn't available on Android
- m_crc32_context =
- crc32(m_crc32_context, m_data.data(), static_cast<unsigned int>(m_data.size()));
- });
- }
- if (m_hashes_to_calculate.md5)
- {
- m_md5_future = std::async(std::launch::async, [this] {
- mbedtls_md5_update_ret(&m_md5_context, m_data.data(), m_data.size());
- });
- }
+ if (m_hashes_to_calculate.md5)
+ {
+ m_md5_future = std::async(std::launch::async, [this] {
+ mbedtls_md5_update_ret(&m_md5_context, m_data.data(), m_data.size());
+ });
+ }
- if (m_hashes_to_calculate.sha1)
- {
- m_sha1_future = std::async(std::launch::async, [this] {
- mbedtls_sha1_update_ret(&m_sha1_context, m_data.data(), m_data.size());
- });
- }
+ if (m_hashes_to_calculate.sha1)
+ {
+ m_sha1_future = std::async(std::launch::async, [this] {
+ mbedtls_sha1_update_ret(&m_sha1_context, m_data.data(), m_data.size());
+ });
}
}
@@ -1262,6 +1264,9 @@ void VolumeVerifier::Finish()
}
}
+ if (m_read_errors_occurred)
+ AddProblem(Severity::Medium, Common::GetStringT("Some of the data could not be read."));
+
if (IsDisc(m_volume.GetVolumeType()) &&
(m_volume.IsSizeAccurate() || m_volume.SupportsIntegrityCheck()))
{
diff --git a/Source/Core/DiscIO/VolumeVerifier.h b/Source/Core/DiscIO/VolumeVerifier.h
index e6b4b33c72..41444c071d 100644
--- a/Source/Core/DiscIO/VolumeVerifier.h
+++ b/Source/Core/DiscIO/VolumeVerifier.h
@@ -174,6 +174,8 @@ private:
bool m_redump_verification;
RedumpVerifier m_redump_verifier;
+ bool m_read_errors_occurred = false;
+
Hashes<bool> m_hashes_to_calculate{};
bool m_calculating_any_hash = false;
unsigned long m_crc32_context = 0;