summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2026-06-21 21:43:50 +0200
committerGitHub <noreply@github.com>2026-06-21 21:43:50 +0200
commit6bdf00ed217d618aa19ab1251da291e597c7cf36 (patch)
treef60d9c3b2e492c6d72faaf6187be9ec6736be4a9
parent79322e77b0fba09d5a0ae94f7e7f5a4ce3e33d50 (diff)
parent95f3f8c6df290ec57b9dafa245ae716ebddd64ac (diff)
Merge pull request #14691 from JosJuice/bba-memory-safety
EXI/BBA: Fix tx_fifo memory safety issues
-rw-r--r--Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp
index c49c6e32b9..f1aa756fa7 100644
--- a/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp
+++ b/Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp
@@ -435,7 +435,11 @@ void CEXIETHERNET::DirectFIFOWrite(const u8* data, u32 size)
// GMAC instead of finagling with packet descriptors and such
u16* tx_fifo_count = (u16*)&mBbaMem[BBA_TXFIFOCNT];
- memcpy(tx_fifo.get() + *tx_fifo_count, data, size);
+ if (data != nullptr && *tx_fifo_count < BBA_TXFIFO_SIZE)
+ {
+ const u32 max_size = BBA_TXFIFO_SIZE - *tx_fifo_count;
+ memcpy(tx_fifo.get() + *tx_fifo_count, data, std::min(size, max_size));
+ }
*tx_fifo_count += size;
// TODO: not sure this mask is correct.
@@ -447,7 +451,7 @@ void CEXIETHERNET::DirectFIFOWrite(const u8* data, u32 size)
void CEXIETHERNET::SendFromDirectFIFO()
{
const u8* frame = tx_fifo.get();
- const u16 size = Common::BitCastPtr<u16>(&mBbaMem[BBA_TXFIFOCNT]);
+ const u16 size = std::min<u16>(BBA_TXFIFO_SIZE, Common::BitCastPtr<u16>(&mBbaMem[BBA_TXFIFOCNT]));
if (m_network_interface->SendFrame(frame, size))
m_system.GetPowerPC().GetDebugInterface().NetworkLogger()->LogBBA(frame, size);
}