summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorActs1631 <acts1631kjv@proton.me>2026-08-04 11:47:51 -0400
committerActs1631 <acts1631kjv@proton.me>2026-10-02 14:14:45 -0400
commit1eca2ca31c4e964be8f5e38bf01d786702737252 (patch)
tree4d687705259de23b95ae4ce71a7aec15657ea6dd /Source/Core
parentbb3558a70ecb767ca59c23bbe06fb6bcb78cd3bd (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.cpp9
-rw-r--r--Source/Core/Core/NetPlayProto.h1
-rw-r--r--Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp2
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);