summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2015-02-14 13:46:06 +1100
committerskidau <skidau@gmail.com>2015-02-14 13:46:06 +1100
commit61b19bda3e82b0ed0da4c7a1fabfcf939b0a2ecb (patch)
tree2041a066860e36feb1fcf8e275860c72467dd4f6 /Source/Core
parent73be877a9db8636c4614667ba56fce52fbb5a467 (diff)
parentdf5857b5aff66e5b5c0fd1514a1b3a8a7b929d77 (diff)
Merge pull request #2042 from unknownbrackets/gcz-fix
DiscIO: On decompress to file, write last blocks correctly
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/DiscIO/CompressedBlob.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/Source/Core/DiscIO/CompressedBlob.cpp b/Source/Core/DiscIO/CompressedBlob.cpp
index 74427c95a1..bd3a05806b 100644
--- a/Source/Core/DiscIO/CompressedBlob.cpp
+++ b/Source/Core/DiscIO/CompressedBlob.cpp
@@ -316,8 +316,9 @@ bool DecompressBlobToFile(const std::string& infile, const std::string& outfile,
const CompressedBlobHeader &header = reader->GetHeader();
static const size_t BUFFER_BLOCKS = 32;
size_t buffer_size = header.block_size * BUFFER_BLOCKS;
+ size_t last_buffer_size = header.block_size * (header.num_blocks % BUFFER_BLOCKS);
std::vector<u8> buffer(buffer_size);
- u32 num_buffers = header.num_blocks / BUFFER_BLOCKS;
+ u32 num_buffers = (header.num_blocks + BUFFER_BLOCKS - 1) / BUFFER_BLOCKS;
int progress_monitor = std::max<int>(1, num_buffers / 100);
bool was_cancelled = false;
@@ -329,8 +330,9 @@ bool DecompressBlobToFile(const std::string& infile, const std::string& outfile,
if (was_cancelled)
break;
}
- reader->Read(i * buffer_size, buffer_size, buffer.data());
- f.WriteBytes(buffer.data(), buffer_size);
+ const size_t sz = i == num_buffers - 1 ? last_buffer_size : buffer_size;
+ reader->Read(i * buffer_size, sz, buffer.data());
+ f.WriteBytes(buffer.data(), sz);
}
if (was_cancelled)