From 97bb7ca405e81ecc2dac81510691179a3554b4a4 Mon Sep 17 00:00:00 2001 From: Rodrigo Alfonso Date: Fri, 7 Feb 2025 06:23:23 -0300 Subject: [PATCH] FIX: Sanitizing adapters' byte count --- lib/LinkRawWireless.hpp | 17 ++++++++++++----- lib/LinkWireless.hpp | 15 ++++++++++----- lib/LinkWirelessOpenSDK.hpp | 6 ++++-- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/LinkRawWireless.hpp b/lib/LinkRawWireless.hpp index 6fc3be9..1c512af 100644 --- a/lib/LinkRawWireless.hpp +++ b/lib/LinkRawWireless.hpp @@ -103,6 +103,8 @@ class LinkRawWireless { #else static constexpr int CMD_TIMEOUT = 15; #endif + static constexpr int MAX_TRANSFER_BYTES_SERVER = 87; + static constexpr int MAX_TRANSFER_BYTES_CLIENT = 16; static constexpr int LOGIN_STEPS = 9; static constexpr int COMMAND_HEADER_VALUE = 0x9966; static constexpr int RESPONSE_ACK = 0x80; @@ -865,11 +867,16 @@ class LinkRawWireless { for (u32 i = 1; i < result.dataSize; i++) response.data[i - 1] = result.data[i]; u32 header = result.data[0]; - response.sentBytes[0] = header & 0b1111111; - response.sentBytes[1] = (header >> 8) & 0b11111; - response.sentBytes[2] = (header >> 13) & 0b11111; - response.sentBytes[3] = (header >> 18) & 0b11111; - response.sentBytes[4] = (header >> 23) & 0b11111; + response.sentBytes[0] = + Link::_min(header & 0b1111111, MAX_TRANSFER_BYTES_SERVER); + response.sentBytes[1] = + Link::_min((header >> 8) & 0b11111, MAX_TRANSFER_BYTES_CLIENT); + response.sentBytes[2] = + Link::_min((header >> 13) & 0b11111, MAX_TRANSFER_BYTES_CLIENT); + response.sentBytes[3] = + Link::_min((header >> 18) & 0b11111, MAX_TRANSFER_BYTES_CLIENT); + response.sentBytes[4] = + Link::_min((header >> 23) & 0b11111, MAX_TRANSFER_BYTES_CLIENT); return true; } diff --git a/lib/LinkWireless.hpp b/lib/LinkWireless.hpp index 46ea4f4..b5b252c 100644 --- a/lib/LinkWireless.hpp +++ b/lib/LinkWireless.hpp @@ -1386,11 +1386,16 @@ class LinkWireless { // parse ReceiveData header u32 sentBytes[LINK_WIRELESS_MAX_PLAYERS] = {0, 0, 0, 0, 0}; u32 receiveDataHeader = result->data[0]; - sentBytes[0] = receiveDataHeader & 0b1111111; - sentBytes[1] = (receiveDataHeader >> 8) & 0b11111; - sentBytes[2] = (receiveDataHeader >> 13) & 0b11111; - sentBytes[3] = (receiveDataHeader >> 18) & 0b11111; - sentBytes[4] = (receiveDataHeader >> 23) & 0b11111; + sentBytes[0] = Link::_min(receiveDataHeader & 0b1111111, + LinkRawWireless::MAX_TRANSFER_BYTES_SERVER); + sentBytes[1] = Link::_min((receiveDataHeader >> 8) & 0b11111, + LinkRawWireless::MAX_TRANSFER_BYTES_CLIENT); + sentBytes[2] = Link::_min((receiveDataHeader >> 13) & 0b11111, + LinkRawWireless::MAX_TRANSFER_BYTES_CLIENT); + sentBytes[3] = Link::_min((receiveDataHeader >> 18) & 0b11111, + LinkRawWireless::MAX_TRANSFER_BYTES_CLIENT); + sentBytes[4] = Link::_min((receiveDataHeader >> 23) & 0b11111, + LinkRawWireless::MAX_TRANSFER_BYTES_CLIENT); bool isServer = linkRawWireless.getState() == State::SERVING; u32 cursor = 1; diff --git a/lib/LinkWirelessOpenSDK.hpp b/lib/LinkWirelessOpenSDK.hpp index 958e40b..5c6dd59 100644 --- a/lib/LinkWirelessOpenSDK.hpp +++ b/lib/LinkWirelessOpenSDK.hpp @@ -30,8 +30,10 @@ class LinkWirelessOpenSDK { public: static constexpr int MAX_TRANSFER_WORDS = 23; - static constexpr int MAX_TRANSFER_BYTES_SERVER = 87; - static constexpr int MAX_TRANSFER_BYTES_CLIENT = 16; + static constexpr int MAX_TRANSFER_BYTES_SERVER = + LinkRawWireless::MAX_TRANSFER_BYTES_SERVER; + static constexpr int MAX_TRANSFER_BYTES_CLIENT = + LinkRawWireless::MAX_TRANSFER_BYTES_CLIENT; static constexpr int HEADER_SIZE_SERVER = 3; static constexpr int HEADER_SIZE_CLIENT = 2; static constexpr int HEADER_MASK_SERVER = 0b1111111111111111111111;