From 87135db49221de289ab317eb4bd5a249277e6ff4 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 15 Jun 2020 02:22:11 +0200 Subject: [PATCH 1/3] GCMemcardDirectory: Clarify data writing in FlushToFile(). --- Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp b/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp index da170ffd30..c07c6f19d1 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp +++ b/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp @@ -629,7 +629,8 @@ void GCMemcardDirectory::FlushToFile() if (gci) { gci.WriteBytes(&save.m_gci_header, Memcard::DENTRY_SIZE); - gci.WriteBytes(save.m_save_data.data(), Memcard::BLOCK_SIZE * save.m_save_data.size()); + for (const Memcard::GCMBlock& block : save.m_save_data) + gci.WriteBytes(block.m_block.data(), Memcard::BLOCK_SIZE); if (gci.IsGood()) { From 131eb9107b8394df22ae937ac1f7ae889596a5fa Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Wed, 17 Jun 2020 00:14:14 +0200 Subject: [PATCH 2/3] GCMemcard: Avoid undefined behavior in the static Format(). --- Source/Core/Core/HW/GCMemcard/GCMemcard.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp b/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp index 27149e7895..8da2ff856d 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp +++ b/Source/Core/Core/HW/GCMemcard/GCMemcard.cpp @@ -1373,16 +1373,17 @@ bool GCMemcard::Format(u8* card_data, const CardFlashId& flash_id, u16 size_mbit { if (!card_data) return false; - memset(card_data, 0xFF, BLOCK_SIZE * 3); - memset(card_data + BLOCK_SIZE * 3, 0, BLOCK_SIZE * 2); - *((Header*)card_data) = - Header(flash_id, size_mbits, shift_jis, rtc_bias, sram_language, format_time); + Header header(flash_id, size_mbits, shift_jis, rtc_bias, sram_language, format_time); + Directory dir; + BlockAlloc bat(size_mbits); + + std::memcpy(&card_data[BLOCK_SIZE * 0], &header, BLOCK_SIZE); + std::memcpy(&card_data[BLOCK_SIZE * 1], &dir, BLOCK_SIZE); + std::memcpy(&card_data[BLOCK_SIZE * 2], &dir, BLOCK_SIZE); + std::memcpy(&card_data[BLOCK_SIZE * 3], &bat, BLOCK_SIZE); + std::memcpy(&card_data[BLOCK_SIZE * 4], &bat, BLOCK_SIZE); - *((Directory*)(card_data + BLOCK_SIZE)) = Directory(); - *((Directory*)(card_data + BLOCK_SIZE * 2)) = Directory(); - *((BlockAlloc*)(card_data + BLOCK_SIZE * 3)) = BlockAlloc(size_mbits); - *((BlockAlloc*)(card_data + BLOCK_SIZE * 4)) = BlockAlloc(size_mbits); return true; } From b175c203e4c59bd68163342e8b77ffb26f7c7b00 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Wed, 17 Jun 2020 00:35:42 +0200 Subject: [PATCH 3/3] GCMemcardDirectory: Avoid undefined behavior in ClearBlock(). --- Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp b/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp index c07c6f19d1..435bbad164 100644 --- a/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp +++ b/Source/Core/Core/HW/GCMemcard/GCMemcardDirectory.cpp @@ -430,7 +430,7 @@ void GCMemcardDirectory::ClearBlock(u32 address) if (m_last_block == -1) return; } - ((Memcard::GCMBlock*)m_last_block_address)->Erase(); + std::memset(m_last_block_address, 0xFF, Memcard::BLOCK_SIZE); } inline void GCMemcardDirectory::SyncSaves()