diff options
| author | Acts1631 <acts1631kjv@proton.me> | 2026-08-04 11:47:51 -0400 |
|---|---|---|
| committer | Acts1631 <acts1631kjv@proton.me> | 2026-10-02 14:14:45 -0400 |
| commit | 1eca2ca31c4e964be8f5e38bf01d786702737252 (patch) | |
| tree | 4d687705259de23b95ae4ce71a7aec15657ea6dd /Source/Core | |
| parent | bb3558a70ecb767ca59c23bbe06fb6bcb78cd3bd (diff) | |
NetPlay: reject oversized input buffer messages
A NetPlay host could send an arbitrary buffer size to a client. The
client then tried to allocate input states until it reached that value.
Limit buffer sizes to the existing user-interface maximum. Invalid peer
values are ignored.
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/NetPlayClient.cpp | 9 | ||||
| -rw-r--r-- | Source/Core/Core/NetPlayProto.h | 1 | ||||
| -rw-r--r-- | Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp | 2 |
3 files changed, 10 insertions, 2 deletions
diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index df54510e53..9a189ae3f7 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -754,8 +754,13 @@ void NetPlayClient::OnPadBuffer(sf::Packet& packet) u32 size = 0; packet >> size; - m_target_buffer_size = size; - m_dialog->OnPadBufferChanged(size); + if (size > MAX_TARGET_PAD_BUFFER_SIZE) + { + WARN_LOG_FMT(NETPLAY, "Ignoring invalid pad buffer size {}.", size); + return; + } + + AdjustPadBufferSize(size); } void NetPlayClient::OnHostInputAuthority(sf::Packet& packet) diff --git a/Source/Core/Core/NetPlayProto.h b/Source/Core/Core/NetPlayProto.h index 0cc897ebbd..0458e32237 100644 --- a/Source/Core/Core/NetPlayProto.h +++ b/Source/Core/Core/NetPlayProto.h @@ -244,6 +244,7 @@ enum class SyncCodeID : u8 }; constexpr u32 MAX_NAME_LENGTH = 30; +constexpr u32 MAX_TARGET_PAD_BUFFER_SIZE = 99; constexpr size_t CHUNKED_DATA_UNIT_SIZE = 16384; constexpr u32 MAX_ENET_MTU = 1392; // see https://github.com/lsalzman/enet/issues/132 diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp index 733ba76bd1..c4ebae425c 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp @@ -33,6 +33,7 @@ #include "Common/Logging/Log.h" #include "Common/TraversalClient.h" #include "Core/NetPlayCommon.h" +#include "Core/NetPlayProto.h" #include "Core/Boot/Boot.h" #include "Core/Config/GraphicsSettings.h" @@ -130,6 +131,7 @@ void NetPlayDialog::CreateMainLayout() m_game_button = new QPushButton; m_start_button = new QPushButton(tr("Start")); m_buffer_size_box = new QSpinBox; + m_buffer_size_box->setMaximum(NetPlay::MAX_TARGET_PAD_BUFFER_SIZE); m_buffer_label = new QLabel(tr("Buffer:")); m_quit_button = new QPushButton(tr("Quit")); m_splitter = new QSplitter(Qt::Horizontal); |
