Merge pull request #9105 from JosJuice/volumeverifier-small-low-severity
VolumeVerifier: Make high severity "too small" hide low severity "too small"
This commit is contained in:
commit
ab2e226df8
|
@ -391,7 +391,11 @@ void VolumeVerifier::Start()
|
||||||
(m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||
|
(m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||
|
||||||
IsDebugSigned();
|
IsDebugSigned();
|
||||||
|
|
||||||
CheckDiscSize(CheckPartitions());
|
const std::vector<Partition> partitions = CheckPartitions();
|
||||||
|
|
||||||
|
if (IsDisc(m_volume.GetVolumeType()))
|
||||||
|
m_biggest_referenced_offset = GetBiggestReferencedOffset(partitions);
|
||||||
|
|
||||||
CheckMisc();
|
CheckMisc();
|
||||||
|
|
||||||
SetUpHashing();
|
SetUpHashing();
|
||||||
|
@ -727,13 +731,14 @@ bool VolumeVerifier::ShouldBeDualLayer() const
|
||||||
std::string_view(m_volume.GetGameID()));
|
std::string_view(m_volume.GetGameID()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VolumeVerifier::CheckDiscSize(const std::vector<Partition>& partitions)
|
void VolumeVerifier::CheckVolumeSize()
|
||||||
{
|
{
|
||||||
if (!IsDisc(m_volume.GetVolumeType()))
|
u64 volume_size = m_volume.GetSize();
|
||||||
return;
|
const bool is_disc = IsDisc(m_volume.GetVolumeType());
|
||||||
|
const bool should_be_dual_layer = is_disc && ShouldBeDualLayer();
|
||||||
|
const bool is_size_accurate = m_volume.IsSizeAccurate();
|
||||||
|
bool volume_size_roughly_known = is_size_accurate;
|
||||||
|
|
||||||
m_biggest_referenced_offset = GetBiggestReferencedOffset(partitions);
|
|
||||||
const bool should_be_dual_layer = ShouldBeDualLayer();
|
|
||||||
if (should_be_dual_layer && m_biggest_referenced_offset <= SL_DVD_R_SIZE)
|
if (should_be_dual_layer && m_biggest_referenced_offset <= SL_DVD_R_SIZE)
|
||||||
{
|
{
|
||||||
AddProblem(Severity::Medium,
|
AddProblem(Severity::Medium,
|
||||||
|
@ -743,21 +748,44 @@ void VolumeVerifier::CheckDiscSize(const std::vector<Partition>& partitions)
|
||||||
"This problem generally only exists in illegal copies of games."));
|
"This problem generally only exists in illegal copies of games."));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_volume.IsSizeAccurate())
|
if (!is_size_accurate)
|
||||||
{
|
{
|
||||||
AddProblem(Severity::Low,
|
AddProblem(Severity::Low,
|
||||||
Common::GetStringT("The format that the disc image is saved in does not "
|
Common::GetStringT("The format that the disc image is saved in does not "
|
||||||
"store the size of the disc image."));
|
"store the size of the disc image."));
|
||||||
|
|
||||||
|
if (m_volume.SupportsIntegrityCheck())
|
||||||
|
{
|
||||||
|
volume_size = m_biggest_verified_offset;
|
||||||
|
volume_size_roughly_known = true;
|
||||||
}
|
}
|
||||||
else if (!m_is_tgc)
|
}
|
||||||
|
|
||||||
|
if (m_content_index != m_content_offsets.size() || m_block_index != m_blocks.size() ||
|
||||||
|
(volume_size_roughly_known && m_biggest_referenced_offset > volume_size))
|
||||||
|
{
|
||||||
|
const bool second_layer_missing = is_disc && volume_size_roughly_known &&
|
||||||
|
volume_size >= SL_DVD_SIZE && volume_size <= SL_DVD_R_SIZE;
|
||||||
|
std::string text =
|
||||||
|
second_layer_missing ?
|
||||||
|
Common::GetStringT("This disc image is too small and lacks some data. The problem is "
|
||||||
|
"most likely that this is a dual-layer disc that has been dumped "
|
||||||
|
"as a single-layer disc.") :
|
||||||
|
Common::GetStringT("This disc image is too small and lacks some data. If your "
|
||||||
|
"dumping program saved the disc image as several parts, you need "
|
||||||
|
"to merge them into one file.");
|
||||||
|
AddProblem(Severity::High, std::move(text));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_disc && is_size_accurate && !m_is_tgc)
|
||||||
{
|
{
|
||||||
const Platform platform = m_volume.GetVolumeType();
|
const Platform platform = m_volume.GetVolumeType();
|
||||||
const bool should_be_gc_size = platform == Platform::GameCubeDisc || m_is_datel;
|
const bool should_be_gc_size = platform == Platform::GameCubeDisc || m_is_datel;
|
||||||
const u64 size = m_volume.GetSize();
|
|
||||||
|
|
||||||
const bool valid_gamecube = size == MINI_DVD_SIZE;
|
const bool valid_gamecube = volume_size == MINI_DVD_SIZE;
|
||||||
const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;
|
const bool valid_retail_wii = volume_size == SL_DVD_SIZE || volume_size == DL_DVD_SIZE;
|
||||||
const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;
|
const bool valid_debug_wii = volume_size == SL_DVD_R_SIZE || volume_size == DL_DVD_R_SIZE;
|
||||||
|
|
||||||
const bool debug = IsDebugSigned();
|
const bool debug = IsDebugSigned();
|
||||||
if ((should_be_gc_size && !valid_gamecube) ||
|
if ((should_be_gc_size && !valid_gamecube) ||
|
||||||
|
@ -779,7 +807,7 @@ void VolumeVerifier::CheckDiscSize(const std::vector<Partition>& partitions)
|
||||||
else
|
else
|
||||||
normal_size = DL_DVD_SIZE;
|
normal_size = DL_DVD_SIZE;
|
||||||
|
|
||||||
if (size < normal_size)
|
if (volume_size < normal_size)
|
||||||
{
|
{
|
||||||
AddProblem(
|
AddProblem(
|
||||||
Severity::Low,
|
Severity::Low,
|
||||||
|
@ -1296,33 +1324,7 @@ void VolumeVerifier::Finish()
|
||||||
if (m_read_errors_occurred)
|
if (m_read_errors_occurred)
|
||||||
AddProblem(Severity::Medium, Common::GetStringT("Some of the data could not be read."));
|
AddProblem(Severity::Medium, Common::GetStringT("Some of the data could not be read."));
|
||||||
|
|
||||||
bool file_too_small = false;
|
CheckVolumeSize();
|
||||||
|
|
||||||
if (m_content_index != m_content_offsets.size() || m_block_index != m_blocks.size())
|
|
||||||
file_too_small = true;
|
|
||||||
|
|
||||||
if (IsDisc(m_volume.GetVolumeType()) &&
|
|
||||||
(m_volume.IsSizeAccurate() || m_volume.SupportsIntegrityCheck()))
|
|
||||||
{
|
|
||||||
u64 volume_size = m_volume.IsSizeAccurate() ? m_volume.GetSize() : m_biggest_verified_offset;
|
|
||||||
if (m_biggest_referenced_offset > volume_size)
|
|
||||||
file_too_small = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_too_small)
|
|
||||||
{
|
|
||||||
const bool second_layer_missing =
|
|
||||||
m_biggest_referenced_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;
|
|
||||||
std::string text =
|
|
||||||
second_layer_missing ?
|
|
||||||
Common::GetStringT("This disc image is too small and lacks some data. The problem is "
|
|
||||||
"most likely that this is a dual-layer disc that has been dumped "
|
|
||||||
"as a single-layer disc.") :
|
|
||||||
Common::GetStringT("This disc image is too small and lacks some data. If your "
|
|
||||||
"dumping program saved the disc image as several parts, you need "
|
|
||||||
"to merge them into one file.");
|
|
||||||
AddProblem(Severity::High, std::move(text));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto [partition, blocks] : m_block_errors)
|
for (auto [partition, blocks] : m_block_errors)
|
||||||
{
|
{
|
||||||
|
|
|
@ -153,7 +153,7 @@ private:
|
||||||
bool ShouldHaveInstallPartition() const;
|
bool ShouldHaveInstallPartition() const;
|
||||||
bool ShouldHaveMasterpiecePartitions() const;
|
bool ShouldHaveMasterpiecePartitions() const;
|
||||||
bool ShouldBeDualLayer() const;
|
bool ShouldBeDualLayer() const;
|
||||||
void CheckDiscSize(const std::vector<Partition>& partitions);
|
void CheckVolumeSize();
|
||||||
u64 GetBiggestReferencedOffset(const std::vector<Partition>& partitions) const;
|
u64 GetBiggestReferencedOffset(const std::vector<Partition>& partitions) const;
|
||||||
u64 GetBiggestReferencedOffset(const FileInfo& file_info) const;
|
u64 GetBiggestReferencedOffset(const FileInfo& file_info) const;
|
||||||
void CheckMisc();
|
void CheckMisc();
|
||||||
|
|
Loading…
Reference in New Issue