summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2020-06-17 00:14:14 +0200
committerAdmiral H. Curtiss <pikachu025@gmail.com>2020-08-24 19:32:10 +0200
commit131eb9107b8394df22ae937ac1f7ae889596a5fa (patch)
tree4edf6696905dcb24fa64d338d0fb5a5161155528 /Source/Core
parent87135db49221de289ab317eb4bd5a249277e6ff4 (diff)
GCMemcard: Avoid undefined behavior in the static Format().
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/GCMemcard/GCMemcard.cpp17
1 files 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;
}