From d533572ee92ac60cf04942102c3eed0071f5897a Mon Sep 17 00:00:00 2001 From: nohbdy Date: Thu, 27 Mar 2014 21:50:30 -0500 Subject: [PATCH] Minor code and memory initialization fixes * Explicitly initialize member variables in SELFDecrypter, MemInfo, and VirtualMemoryBlock * Zero out memory used for counter/nonce in aes-ctr * Fix use of a ControlInfo pointer after it is added to an Array via Array::Move (which makes it an invalid pointer) in SELFDecrypter::LoadHeaders --- rpcs3/Crypto/unself.cpp | 8 ++++++-- rpcs3/Emu/Memory/Memory.cpp | 2 +- rpcs3/Emu/Memory/MemoryBlock.h | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index df298b434c..3a10863859 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -2,7 +2,7 @@ #include "unself.h" SELFDecrypter::SELFDecrypter(vfsStream& s) - : self_f(s), key_v() + : self_f(s), key_v(), data_buf_length(0) { } @@ -92,9 +92,10 @@ bool SELFDecrypter::LoadHeaders(bool isElf32) { ControlInfo* cinfo = new ControlInfo(); cinfo->Load(self_f); - ctrlinfo_arr.Move(cinfo); i += cinfo->size; + + ctrlinfo_arr.Move(cinfo); } // Read ELF section headers. @@ -369,6 +370,9 @@ bool SELFDecrypter::DecryptData() self_f.Seek(meta_shdr[i].data_offset); self_f.Read(buf, meta_shdr[i].data_size); + // Zero out our ctr nonce + memset(ctr_stream_block, 0, sizeof(ctr_stream_block)); + // Perform AES-CTR encryption on the data blocks. aes_setkey_enc(&aes, data_key, 128); aes_crypt_ctr(&aes, meta_shdr[i].data_size, &ctr_nc_off, data_iv, ctr_stream_block, buf, buf); diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index 8bf12506dc..234432aaab 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -535,7 +535,7 @@ template<> __forceinline u64 MemoryBase::ReverseData<2>(u64 val) { return Revers template<> __forceinline u64 MemoryBase::ReverseData<4>(u64 val) { return Reverse32(val); } template<> __forceinline u64 MemoryBase::ReverseData<8>(u64 val) { return Reverse64(val); } -VirtualMemoryBlock::VirtualMemoryBlock() : MemoryBlock() +VirtualMemoryBlock::VirtualMemoryBlock() : MemoryBlock(), m_reserve_size(0) { } diff --git a/rpcs3/Emu/Memory/MemoryBlock.h b/rpcs3/Emu/Memory/MemoryBlock.h index 2b0d11c04e..1e4bc16415 100644 --- a/rpcs3/Emu/Memory/MemoryBlock.h +++ b/rpcs3/Emu/Memory/MemoryBlock.h @@ -13,7 +13,7 @@ struct MemInfo { } - MemInfo() + MemInfo() : addr(0), size(0) { } };