From 44268596b35db76a7f9b1bf49884a21b972699b2 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Fri, 26 Jul 2024 00:39:45 -0500 Subject: [PATCH] Add a size check to the client on controller data receiving --- NetworkClient.cpp | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/NetworkClient.cpp b/NetworkClient.cpp index c32d011b..2037cc64 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -556,31 +556,38 @@ void NetworkClient::ProcessReply_ControllerCount(unsigned int data_size, char * } } -void NetworkClient::ProcessReply_ControllerData(unsigned int /*data_size*/, char * data, unsigned int dev_idx) +void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * data, unsigned int dev_idx) { - RGBController_Network * new_controller = new RGBController_Network(this, dev_idx); - - new_controller->ReadDeviceDescription((unsigned char *)data, GetProtocolVersion()); - - ControllerListMutex.lock(); - - if(dev_idx >= server_controllers.size()) + /*---------------------------------------------------------*\ + | Verify the controller description size (first 4 bytes of | + | data) matches the packet size in the header | + \*---------------------------------------------------------*/ + if(data_size == *((unsigned int*)data)) { - server_controllers.push_back(new_controller); - } - else - { - server_controllers[dev_idx]->active_mode = new_controller->active_mode; - for(unsigned int i = 0; i < server_controllers[dev_idx]->zones.size(); i++) + RGBController_Network * new_controller = new RGBController_Network(this, dev_idx); + + new_controller->ReadDeviceDescription((unsigned char *)data, GetProtocolVersion()); + + ControllerListMutex.lock(); + + if(dev_idx >= server_controllers.size()) { - server_controllers[dev_idx]->zones[i].leds_count = new_controller->zones[i].leds_count; + server_controllers.push_back(new_controller); } - delete new_controller; + else + { + server_controllers[dev_idx]->active_mode = new_controller->active_mode; + for(unsigned int i = 0; i < server_controllers[dev_idx]->zones.size(); i++) + { + server_controllers[dev_idx]->zones[i].leds_count = new_controller->zones[i].leds_count; + } + delete new_controller; + } + + ControllerListMutex.unlock(); + + controller_data_received = true; } - - ControllerListMutex.unlock(); - - controller_data_received = true; } void NetworkClient::ProcessReply_ProtocolVersion(unsigned int data_size, char * data)