diff options
author | Frediano Ziglio <freddy77@gmail.com> | 2020-05-14 09:22:48 +0100 |
---|---|---|
committer | Frediano Ziglio <freddy77@gmail.com> | 2020-05-15 11:50:08 +0100 |
commit | 0fe97cc05aee4669b446ac85e19066c4771860ff (patch) | |
tree | d111120e439fa3012deeb6c8d293332698764537 | |
parent | f2ef1094f2d8a11eb08d81588de2d1c3e75ad4f4 (diff) |
Use final capabilities to check client messages
The client is sending messages that are compatible with agent
capabilities but also encoded with capabilities it knows of so to
check them we need to consider final capabilities, not client ones.
This fixes a regression introduced with
"vdagent: Reuse agent_check_message" where some messages were wrongly
interpreted as wrong (particularly some clipboard messages).
Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
Acked-by: Jakub Janků <jjanku@redhat.com>
-rw-r--r-- | vdagent/vdagent.cpp | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp index 3e100f8..35a7c95 100644 --- a/vdagent/vdagent.cpp +++ b/vdagent/vdagent.cpp @@ -28,6 +28,7 @@ #include <queue> #include <set> #include <vector> +#include <array> #define VD_AGENT_LOG_PATH TEXT("%svdagent.log") #define VD_AGENT_WINCLASS_NAME TEXT("VDAGENT") @@ -161,6 +162,7 @@ private: int32_t _max_clipboard; std::vector<uint32_t> _client_caps; + std::array<uint32_t, VD_AGENT_CAPS_SIZE> _final_caps; std::set<uint32_t> _grab_types; @@ -813,6 +815,18 @@ void VDAgent::load_display_setting() _display_setting.load(); } +static const uint16_t supported_caps[] = { + VD_AGENT_CAP_MOUSE_STATE, + VD_AGENT_CAP_MONITORS_CONFIG, + VD_AGENT_CAP_REPLY, + VD_AGENT_CAP_DISPLAY_CONFIG, + VD_AGENT_CAP_CLIPBOARD_BY_DEMAND, + VD_AGENT_CAP_SPARSE_MONITORS_CONFIG, + VD_AGENT_CAP_GUEST_LINEEND_CRLF, + VD_AGENT_CAP_MAX_CLIPBOARD, + VD_AGENT_CAP_FILE_XFER_DETAILED_ERRORS, +}; + bool VDAgent::send_announce_capabilities(bool request) { DWORD msg_size; @@ -838,15 +852,9 @@ bool VDAgent::send_announce_capabilities(bool request) caps = (VDAgentAnnounceCapabilities*)caps_msg->data; caps->request = request; memset(caps->caps, 0, VD_AGENT_CAPS_BYTES); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MOUSE_STATE); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MONITORS_CONFIG); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_REPLY); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_DISPLAY_CONFIG); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_SPARSE_MONITORS_CONFIG); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_GUEST_LINEEND_CRLF); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MAX_CLIPBOARD); - VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_FILE_XFER_DETAILED_ERRORS); + for (auto cap : supported_caps) { + VD_AGENT_SET_CAPABILITY(caps->caps, cap); + } vd_printf("Sending capabilities:"); for (uint32_t i = 0 ; i < caps_size; ++i) { vd_printf("%X", caps->caps[i]); @@ -866,6 +874,12 @@ bool VDAgent::handle_announce_capabilities(const VDAgentAnnounceCapabilities* an } _client_caps.assign(announce_capabilities->caps, announce_capabilities->caps + caps_size); + for (auto cap : supported_caps) { + if (VD_AGENT_HAS_CAPABILITY(announce_capabilities->caps, caps_size, cap)) { + VD_AGENT_SET_CAPABILITY(_final_caps.data(), cap); + } + } + if (has_capability(VD_AGENT_CAP_MONITORS_CONFIG_POSITION)) _desktop_layout->set_position_configurable(true); if (announce_capabilities->request) { @@ -1253,7 +1267,7 @@ void VDAgent::dispatch_message(VDAgentMessage* msg, uint32_t port) bool res = true; // check message - switch (agent_check_message(msg, msg->data, _client_caps.data(), _client_caps.size())) { + switch (agent_check_message(msg, msg->data, _final_caps.data(), _final_caps.size())) { case AGENT_CHECK_WRONG_PROTOCOL_VERSION: vd_printf("Invalid protocol %u", msg->protocol); _running = false; |