From 73cd84f43c7dcff3c444e94baf70f36eec7dc39c Mon Sep 17 00:00:00 2001 From: Dmitry K Date: Tue, 7 Jul 2026 01:30:36 +0400 Subject: [PATCH] [next] Fix memory leak in serial port detection --- .../ArcticController/ArcticControllerDetect.cpp | 6 ++---- .../BlinkyTapeControllerDetect.cpp | 4 ++-- .../DygmaRaiseControllerDetect.cpp | 6 +++--- .../HYTEMousematControllerDetect_Windows_MacOS.cpp | 6 +++--- .../HYTENexusControllerDetect.cpp | 6 +++--- .../JGINYUEInternalUSBV2ControllerDetect.cpp | 14 +++----------- .../NZXTHuePlusControllerDetect.cpp | 6 +++--- serial_port/find_usb_serial_port.h | 2 +- serial_port/find_usb_serial_port_linux.cpp | 9 ++++----- serial_port/find_usb_serial_port_macos.cpp | 8 +++----- serial_port/find_usb_serial_port_win.cpp | 8 +++----- 11 files changed, 30 insertions(+), 45 deletions(-) diff --git a/Controllers/ArcticController/ArcticControllerDetect.cpp b/Controllers/ArcticController/ArcticControllerDetect.cpp index eb43328b4..63a43c395 100644 --- a/Controllers/ArcticController/ArcticControllerDetect.cpp +++ b/Controllers/ArcticController/ArcticControllerDetect.cpp @@ -21,13 +21,13 @@ DetectedControllers DetectArcticControllers() { DetectedControllers detected_controllers; - std::vector ports; + std::vector ports; ports = find_usb_serial_port(CH341_VID, CH341_PID); for(unsigned int device = 0; device < ports.size(); device++) { - ArcticController *controller = new ArcticController(*ports[device]); + ArcticController *controller = new ArcticController(ports[device]); if(controller->IsPresent()) { @@ -38,8 +38,6 @@ DetectedControllers DetectArcticControllers() { delete controller; } - - delete ports[device]; } return(detected_controllers); diff --git a/Controllers/BlinkyTapeController/BlinkyTapeControllerDetect.cpp b/Controllers/BlinkyTapeController/BlinkyTapeControllerDetect.cpp index 1056280e7..140e3eee2 100644 --- a/Controllers/BlinkyTapeController/BlinkyTapeControllerDetect.cpp +++ b/Controllers/BlinkyTapeController/BlinkyTapeControllerDetect.cpp @@ -24,12 +24,12 @@ DetectedControllers DetectBlinkyTapeControllers() { DetectedControllers detected_controllers; - std::vector device_locations = find_usb_serial_port(BLINKINLABS_VID, BLINKYTAPE_PID); + std::vector device_locations = find_usb_serial_port(BLINKINLABS_VID, BLINKYTAPE_PID); for(unsigned int device_idx = 0; device_idx < device_locations.size(); device_idx++) { BlinkyTapeController* controller = new BlinkyTapeController(); - controller->Initialize(*device_locations[device_idx]); + controller->Initialize(device_locations[device_idx]); RGBController_BlinkyTape* rgb_controller = new RGBController_BlinkyTape(controller); diff --git a/Controllers/DygmaRaiseController/DygmaRaiseControllerDetect.cpp b/Controllers/DygmaRaiseController/DygmaRaiseControllerDetect.cpp index 18828e078..08977abef 100644 --- a/Controllers/DygmaRaiseController/DygmaRaiseControllerDetect.cpp +++ b/Controllers/DygmaRaiseController/DygmaRaiseControllerDetect.cpp @@ -21,14 +21,14 @@ DetectedControllers DetectDygmaRaiseControllers() { DetectedControllers detected_controllers; - std::vector ports = find_usb_serial_port(DYGMA_RAISE_VID, DYGMA_RAISE_PID); + std::vector ports = find_usb_serial_port(DYGMA_RAISE_VID, DYGMA_RAISE_PID); for(std::size_t i = 0; i < ports.size(); i++) { - if(*ports[i] != "") + if(ports[i] != "") { DygmaRaiseController* controller = new DygmaRaiseController(); - controller->Initialize((char *)ports[i]->c_str()); + controller->Initialize((char *)ports[i].c_str()); RGBController_DygmaRaise* rgb_controller = new RGBController_DygmaRaise(controller); diff --git a/Controllers/HYTEMousematController/HYTEMousematController_Windows_MacOS/HYTEMousematControllerDetect_Windows_MacOS.cpp b/Controllers/HYTEMousematController/HYTEMousematController_Windows_MacOS/HYTEMousematControllerDetect_Windows_MacOS.cpp index 6f2b4aa85..9fcdcd4ff 100644 --- a/Controllers/HYTEMousematController/HYTEMousematController_Windows_MacOS/HYTEMousematControllerDetect_Windows_MacOS.cpp +++ b/Controllers/HYTEMousematController/HYTEMousematController_Windows_MacOS/HYTEMousematControllerDetect_Windows_MacOS.cpp @@ -42,13 +42,13 @@ DetectedControllers DetectHYTEMousematControllers() for(unsigned int device_id = 0; device_id < HYTE_MOUSEMAT_NUM_DEVICES; device_id++) { - std::vector ports = find_usb_serial_port(hyte_mousemat_devices[device_id].vid, hyte_mousemat_devices[device_id].pid); + std::vector ports = find_usb_serial_port(hyte_mousemat_devices[device_id].vid, hyte_mousemat_devices[device_id].pid); for(unsigned int i = 0; i < ports.size(); i++) { - if(*ports[i] != "") + if(ports[i] != "") { - HYTEMousematController * controller = new HYTEMousematController((char *)ports[i]->c_str(), hyte_mousemat_devices[device_id].name); + HYTEMousematController * controller = new HYTEMousematController((char *)ports[i].c_str(), hyte_mousemat_devices[device_id].name); RGBController_HYTEMousemat * rgb_controller = new RGBController_HYTEMousemat(controller); detected_controllers.push_back(rgb_controller); diff --git a/Controllers/HYTENexusController/HYTENexusControllerDetect.cpp b/Controllers/HYTENexusController/HYTENexusControllerDetect.cpp index 4e5b75853..d88367073 100644 --- a/Controllers/HYTENexusController/HYTENexusControllerDetect.cpp +++ b/Controllers/HYTENexusController/HYTENexusControllerDetect.cpp @@ -38,13 +38,13 @@ DetectedControllers DetectHYTENexusControllers() for(unsigned int device_id = 0; device_id < HYTE_NEXUS_NUM_DEVICES; device_id++) { - std::vector ports = find_usb_serial_port(hyte_nexus_devices[device_id].vid, hyte_nexus_devices[device_id].pid); + std::vector ports = find_usb_serial_port(hyte_nexus_devices[device_id].vid, hyte_nexus_devices[device_id].pid); for(unsigned int i = 0; i < ports.size(); i++) { - if(*ports[i] != "") + if(ports[i] != "") { - HYTENexusController * controller = new HYTENexusController((char *)ports[i]->c_str(), hyte_nexus_devices[device_id].pid, hyte_nexus_devices[device_id].name); + HYTENexusController * controller = new HYTENexusController((char *)ports[i].c_str(), hyte_nexus_devices[device_id].pid, hyte_nexus_devices[device_id].name); RGBController_HYTENexus * rgb_controller = new RGBController_HYTENexus(controller); detected_controllers.push_back(rgb_controller); diff --git a/Controllers/JGINYUEInternalUSBV2Controller/JGINYUEInternalUSBV2ControllerDetect.cpp b/Controllers/JGINYUEInternalUSBV2Controller/JGINYUEInternalUSBV2ControllerDetect.cpp index 60d4af65a..2b292853c 100644 --- a/Controllers/JGINYUEInternalUSBV2Controller/JGINYUEInternalUSBV2ControllerDetect.cpp +++ b/Controllers/JGINYUEInternalUSBV2Controller/JGINYUEInternalUSBV2ControllerDetect.cpp @@ -52,7 +52,7 @@ DetectedControllers DetectJGINYUEInternalUSBV2Controller(hid_device_info* info,c if(dev) { serial_port *port = nullptr; - std::vector serial_ports = find_usb_serial_port(JGINYUE_VID_V2, JGINYUE_MOTHERBOARD_PID_V2); + std::vector serial_ports = find_usb_serial_port(JGINYUE_VID_V2, JGINYUE_MOTHERBOARD_PID_V2); if(serial_ports.size() == 0) { @@ -66,22 +66,14 @@ DetectedControllers DetectJGINYUEInternalUSBV2Controller(hid_device_info* info,c if(serial_ports.size() >= 1) { port = new serial_port(); - if(!port->serial_open(serial_ports[0]->c_str(), 115200)) + if(!port->serial_open(serial_ports[0].c_str(), 115200)) { - LOG_WARNING("[JGINYUEInternalUSBV2ControllerDetect] Failed to open serial port %s - Direct mode will be unavailable. HID modes will still work.", serial_ports[0]->c_str()); + LOG_WARNING("[JGINYUEInternalUSBV2ControllerDetect] Failed to open serial port %s - Direct mode will be unavailable. HID modes will still work.", serial_ports[0].c_str()); delete port; port = nullptr; } } - /*---------------------------------------------*\ - | Clean up serial port string vector | - \*---------------------------------------------*/ - for(std::string* str_ptr : serial_ports) - { - delete str_ptr; - } - JGINYUEInternalUSBV2Controller * controller = new JGINYUEInternalUSBV2Controller(dev, info->path, port); RGBController_JGINYUEInternalUSBV2 * rgb_controller = new RGBController_JGINYUEInternalUSBV2(controller); diff --git a/Controllers/NZXTHuePlusController/NZXTHuePlusControllerDetect.cpp b/Controllers/NZXTHuePlusController/NZXTHuePlusControllerDetect.cpp index b6ca3febb..dd33c9e2d 100644 --- a/Controllers/NZXTHuePlusController/NZXTHuePlusControllerDetect.cpp +++ b/Controllers/NZXTHuePlusController/NZXTHuePlusControllerDetect.cpp @@ -24,16 +24,16 @@ DetectedControllers DetectNZXTHuePlusControllers() { DetectedControllers detected_controllers; - std::vector ports; + std::vector ports; ports = find_usb_serial_port(NZXT_HUE_PLUS_VID, NZXT_HUE_PLUS_PID); for(std::size_t i = 0; i < ports.size(); i++) { - if(*ports[i] != "") + if(ports[i] != "") { HuePlusController* controller = new HuePlusController(); - controller->Initialize((char *)ports[i]->c_str()); + controller->Initialize((char *)ports[i].c_str()); RGBController_HuePlus* rgb_controller = new RGBController_HuePlus(controller); detected_controllers.push_back(rgb_controller); diff --git a/serial_port/find_usb_serial_port.h b/serial_port/find_usb_serial_port.h index 739146c9d..9448b4d50 100644 --- a/serial_port/find_usb_serial_port.h +++ b/serial_port/find_usb_serial_port.h @@ -18,4 +18,4 @@ #include #include -std::vector find_usb_serial_port(unsigned short vid, unsigned short pid); +std::vector find_usb_serial_port(unsigned short vid, unsigned short pid); diff --git a/serial_port/find_usb_serial_port_linux.cpp b/serial_port/find_usb_serial_port_linux.cpp index 062392db7..b5b339f23 100644 --- a/serial_port/find_usb_serial_port_linux.cpp +++ b/serial_port/find_usb_serial_port_linux.cpp @@ -27,10 +27,9 @@ | | \*---------------------------------------------------------------------*/ -std::vector find_usb_serial_port(unsigned short vid, unsigned short pid) +std::vector find_usb_serial_port(unsigned short vid, unsigned short pid) { - std::vector ret_vector; - std::string * tmp_string; + std::vector ret_vector; DIR* dir; char symlink_path[1024] = {0}; struct dirent* ent; @@ -128,8 +127,8 @@ std::vector find_usb_serial_port(unsigned short vid, unsigned sho break; } } - tmp_string = new std::string("/dev/"); - tmp_string->append(port_string); + std::string tmp_string("/dev/"); + tmp_string.append(port_string); ret_vector.push_back(tmp_string); } diff --git a/serial_port/find_usb_serial_port_macos.cpp b/serial_port/find_usb_serial_port_macos.cpp index e4d0cbff5..b8597a1ed 100644 --- a/serial_port/find_usb_serial_port_macos.cpp +++ b/serial_port/find_usb_serial_port_macos.cpp @@ -53,7 +53,7 @@ std::string exec(const char* cmd) | | \*---------------------------------------------------------------------*/ -std::vector find_usb_serial_port(unsigned short vid, unsigned short pid) +std::vector find_usb_serial_port(unsigned short vid, unsigned short pid) { /*-----------------------------------------------------*\ | Strings to search for in ioreg output | @@ -65,8 +65,7 @@ std::vector find_usb_serial_port(unsigned short vid, unsigned sho /*-----------------------------------------------------*\ | Return variables | \*-----------------------------------------------------*/ - std::vector ret_vector; - std::string * tmp_string; + std::vector ret_vector; /*-----------------------------------------------------*\ | Execute command to list USB devices | @@ -146,8 +145,7 @@ std::vector find_usb_serial_port(unsigned short vid, unsigned sho \*---------------------------------------------*/ if(dev_pos < next_pos) { - tmp_string = new std::string(out_string.substr(start_pos, end_pos-start_pos)); - ret_vector.push_back(tmp_string); + ret_vector.push_back(out_string.substr(start_pos, end_pos-start_pos)); } } diff --git a/serial_port/find_usb_serial_port_win.cpp b/serial_port/find_usb_serial_port_win.cpp index c905665a8..ff7efb852 100644 --- a/serial_port/find_usb_serial_port_win.cpp +++ b/serial_port/find_usb_serial_port_win.cpp @@ -34,10 +34,9 @@ | | \*---------------------------------------------------------------------*/ -std::vector find_usb_serial_port(unsigned short vid, unsigned short pid) +std::vector find_usb_serial_port(unsigned short vid, unsigned short pid) { - std::vector ret_vector; - std::string * tmp_string; + std::vector ret_vector; HDEVINFO DeviceInfoSet; DWORD DeviceIndex = 0; SP_DEVINFO_DATA DeviceInfoData; @@ -113,8 +112,7 @@ std::vector find_usb_serial_port(unsigned short vid, unsigned sho { if(strncmp(pszPortName, "COM", 3) == 0) { - tmp_string = new std::string(pszPortName); - ret_vector.push_back(tmp_string); + ret_vector.push_back(std::string(pszPortName)); } }