diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index 892a66bc7c6..8062d97b7af 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -130,34 +130,37 @@ void FileAccessCompressed::_close() { f->store_32(0); //compressed sizes, will update later } - Vector block_sizes; + uint32_t last_block_size = write_max % block_size; + + // Temporary buffer for compressed data blocks. + LocalVector temp_cblock; + temp_cblock.resize(Compression::get_max_compressed_buffer_size(bc == 1 ? last_block_size : block_size, cmode)); + uint8_t *temp_cblock_ptr = temp_cblock.ptr(); + + // Compress and store the blocks. + LocalVector block_sizes; for (uint32_t i = 0; i < bc; i++) { - uint32_t bl = i == (bc - 1) ? write_max % block_size : block_size; + uint32_t bl = i == (bc - 1) ? last_block_size : block_size; uint8_t *bp = &write_ptr[i * block_size]; - Vector cblock; - cblock.resize(Compression::get_max_compressed_buffer_size(bl, cmode)); - const int64_t compressed_size = Compression::compress(cblock.ptrw(), bp, bl, cmode); + const int64_t compressed_size = Compression::compress(temp_cblock_ptr, bp, bl, cmode); ERR_FAIL_COND_MSG(compressed_size < 0, "FileAccessCompressed: Error compressing data."); - f->store_buffer(cblock.ptr(), (uint64_t)compressed_size); + f->store_buffer(temp_cblock_ptr, (uint64_t)compressed_size); block_sizes.push_back(compressed_size); } f->seek(16); //ok write block sizes for (uint32_t i = 0; i < bc; i++) { - f->store_32(uint32_t(block_sizes[i])); + f->store_32(block_sizes[i]); } f->seek_end(); f->store_buffer((const uint8_t *)mgc.get_data(), mgc.length()); //magic at the end too - - buffer.clear(); - } else { comp_buffer.clear(); - buffer.clear(); read_blocks.clear(); } + buffer.clear(); f.unref(); } diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index 7af7737c433..270b3dcddaa 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -140,7 +140,7 @@ void FileAccessEncrypted::_close() { } if (writing) { - Vector compressed; + LocalVector compressed; uint64_t len = data.size(); if (len % 16) { len += 16 - (len % 16); @@ -150,10 +150,8 @@ void FileAccessEncrypted::_close() { ERR_FAIL_COND(CryptoCore::md5(data.ptr(), data.size(), hash) != OK); // Bug? compressed.resize(len); - memset(compressed.ptrw(), 0, len); - for (int i = 0; i < data.size(); i++) { - compressed.write[i] = data[i]; - } + memcpy(compressed.ptr(), data.ptr(), data.size()); + memset(compressed.ptr() + data.size(), 0, len - data.size()); CryptoCore::AESContext ctx; ctx.set_encode_key(key.ptrw(), 256); @@ -166,7 +164,7 @@ void FileAccessEncrypted::_close() { file->store_64(data.size()); file->store_buffer(iv.ptr(), 16); - ctx.encrypt_cfb(len, iv.ptrw(), compressed.ptrw(), compressed.ptrw()); + ctx.encrypt_cfb(len, iv.ptrw(), compressed.ptr(), compressed.ptr()); file->store_buffer(compressed.ptr(), compressed.size()); data.clear();