From 8266fbbe6af93fa370018886c7f1f35d2cee8b3f Mon Sep 17 00:00:00 2001 From: sithlord48 Date: Tue, 30 Jun 2026 08:29:58 -0400 Subject: [PATCH] fix: Check options array is always an even size --- src/lib/client/Client.cpp | 5 +++++ src/lib/client/ServerProxy.cpp | 5 +++++ src/lib/deskflow/Screen.cpp | 5 +++++ src/lib/platform/XWindowsScreen.cpp | 4 ++++ src/lib/server/ClientProxy1_0.cpp | 5 +++++ 5 files changed, 24 insertions(+) diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index bd1c38568..b6fdebc19 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -301,6 +301,11 @@ void Client::resetOptions() void Client::setOptions(const OptionsList &options) { + if (options.size() % 2 != 0) { + LOG_ERR("options are the incorrect size, can not process them"); + return; + } + for (auto index = options.begin(); index != options.end(); ++index) { const OptionID id = *index; if (id == kOptionClipboardSharing) { diff --git a/src/lib/client/ServerProxy.cpp b/src/lib/client/ServerProxy.cpp index 8fc69a88c..0c0c1a136 100644 --- a/src/lib/client/ServerProxy.cpp +++ b/src/lib/client/ServerProxy.cpp @@ -773,6 +773,11 @@ void ServerProxy::setOptions() ProtocolUtil::readf(m_stream, kMsgDSetOptions + 4, &options); LOG_VERBOSE("recv set options size=%d", options.size()); + if (options.size() % 2 != 0) { + LOG_ERR("options are the incorrect size, can not process them"); + return; + } + // forward m_client->setOptions(options); diff --git a/src/lib/deskflow/Screen.cpp b/src/lib/deskflow/Screen.cpp index b5303de38..f057d2d01 100644 --- a/src/lib/deskflow/Screen.cpp +++ b/src/lib/deskflow/Screen.cpp @@ -281,6 +281,11 @@ void Screen::resetOptions() void Screen::setOptions(const OptionsList &options) { + if (options.size() % 2 != 0) { + LOG_ERR("options are the incorrect size, can not process them"); + return; + } + // update options for (uint32_t i = 0, n = (uint32_t)options.size(); i < n; i += 2) { if (options[i] == kOptionHalfDuplexCapsLock) { diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index 0408911ce..68418dd46 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -400,6 +400,10 @@ void XWindowsScreen::resetOptions() void XWindowsScreen::setOptions(const OptionsList &options) { + if (options.size() % 2 != 0) { + LOG_ERR("options are the incorrect size, can not process them"); + return; + } for (uint32_t i = 0, n = options.size(); i < n; i += 2) { if (options[i] == kOptionXTestXineramaUnaware) { m_xtestIsXineramaUnaware = (options[i + 1] != 0); diff --git a/src/lib/server/ClientProxy1_0.cpp b/src/lib/server/ClientProxy1_0.cpp index 05bab6764..a0b422730 100644 --- a/src/lib/server/ClientProxy1_0.cpp +++ b/src/lib/server/ClientProxy1_0.cpp @@ -350,6 +350,11 @@ void ClientProxy1_0::resetOptions() void ClientProxy1_0::setOptions(const OptionsList &options) { LOG_VERBOSE("send set options to \"%s\" size=%d", getName().c_str(), options.size()); + if (options.size() % 2 != 0) { + LOG_ERR("options are the incorrect size, not sending"); + return; + } + ProtocolUtil::writef(getStream(), kMsgDSetOptions, &options); // check options