From d8c79c5d2a44b4c49f85d243f613bc9b90c80575 Mon Sep 17 00:00:00 2001 From: Pengfei Date: Tue, 27 Jul 2021 19:48:33 +0800 Subject: [PATCH] Critical bug fix --- src/core/ncch/ncch_container.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/ncch/ncch_container.cpp b/src/core/ncch/ncch_container.cpp index d16b334..5183ce2 100644 --- a/src/core/ncch/ncch_container.cpp +++ b/src/core/ncch/ncch_container.cpp @@ -500,8 +500,20 @@ ResultStatus NCCHContainer::DecryptToFile(std::shared_ptr dest return false; } ASSERT_MSG(written <= offset, "Offsets are not in increasing order"); + + // Zero out the gap manually to ensure correct hashes when used with CIAs, etc. + const std::array zeroes{}; + std::size_t zeroes_left = offset - written; + while (zeroes_left > 0) { + const auto to_write = std::min(zeroes.size(), zeroes_left); + if (dest_file->WriteBytes(zeroes.data(), to_write) != to_write) { + LOG_ERROR(Core, "Could not write zeroes before {}", name); + return false; + } + zeroes_left -= to_write; + } + file->Seek(offset, SEEK_SET); - dest_file->Seek(offset, SEEK_SET); if (aborted.exchange(false)) { return false;