summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorActs1631 <acts1631kjv@proton.me>2026-10-04 16:34:34 -0400
committerActs1631 <acts1631kjv@proton.me>2026-10-04 16:34:34 -0400
commitc987640440cd9fda480af384aac7c554869a0cfb (patch)
treec2fd14c03402b3e839a57a2215a7969aee3a80f5 /Source/Core
parenteb236466c4f0ec8bef619add0972353d3996fe6c (diff)
NetPlay: reject oversized Wii save banners
The save sync parser preserved an oversized banner length after limiting the copy into the fixed header buffer. The NAND writer then used the untrusted length and read beyond the stack object. Reject invalid or oversized lengths before copying the banner.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/NetPlayClient.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp
index 9a189ae3f7..61e6329b9e 100644
--- a/Source/Core/Core/NetPlayClient.cpp
+++ b/Source/Core/Core/NetPlayClient.cpp
@@ -1209,12 +1209,18 @@ void NetPlayClient::OnSyncSaveDataWii(sf::Packet& packet)
WiiSave::Header header;
packet >> header.tid;
packet >> header.banner_size;
+ if (!packet || header.banner_size > sizeof(header.banner))
+ {
+ WARN_LOG_FMT(NETPLAY, "Received invalid Wii save banner size.");
+ SyncSaveDataResponse(false);
+ return;
+ }
packet >> header.permissions;
packet >> header.unk1;
for (u8& byte : header.md5)
packet >> byte;
packet >> header.unk2;
- for (size_t i = 0; i < std::min<size_t>(header.banner_size, sizeof(header.banner)); i++)
+ for (size_t i = 0; i < header.banner_size; i++)
packet >> header.banner[i];
// BkHeader