From 20737f8b06d4a968a63bc47504b74ebbb4eb4ae4 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 11 Aug 2026 15:19:10 -0400 Subject: [PATCH 1/3] RDKEMW-23367 : ctrlm-main - coverity issues --- src/ctrlm_main.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index 8bfc1ab9..78f911a2 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -106,10 +106,11 @@ using namespace std; #define CTRLM_RESTART_DELAY_SHORT "0" #define CTRLM_RESTART_UPDATE_TIMEOUT (5000) -#define CTRLM_RF4CE_LEN_IR_REMOTE_USAGE 14 -#define CTRLM_RF4CE_LEN_LAST_KEY_INFO sizeof(ctrlm_last_key_info) -#define CTRLM_RF4CE_LEN_SHUTDOWN_TIME 4 -#define CTRLM_RF4CE_LEN_PAIRING_METRICS sizeof(ctrlm_pairing_metrics_t) +#define CTRLM_RF4CE_LEN_IR_REMOTE_USAGE 14 +#define CTRLM_RF4CE_LEN_LAST_KEY_INFO sizeof(ctrlm_last_key_info) +#define CTRLM_RF4CE_LEN_SHUTDOWN_TIME_LEGACY 4 +#define CTRLM_RF4CE_LEN_SHUTDOWN_TIME sizeof(time_t) +#define CTRLM_RF4CE_LEN_PAIRING_METRICS sizeof(ctrlm_pairing_metrics_t) #define CTRLM_MAIN_QUEUE_REPEAT_DELAY (5000) @@ -4446,20 +4447,24 @@ void ctrlm_discovery_remote_type_set_(const char *remote_type_str) { void ctrlm_property_write_shutdown_time(void) { guchar data[CTRLM_RF4CE_LEN_SHUTDOWN_TIME]; - data[0] = (guchar)(g_ctrlm.shutdown_time); - data[1] = (guchar)(g_ctrlm.shutdown_time >> 8); - data[2] = (guchar)(g_ctrlm.shutdown_time >> 16); - data[3] = (guchar)(g_ctrlm.shutdown_time >> 24); + guint64 shutdown_time = (guint64)g_ctrlm.shutdown_time; + for(guchar index = 0; index < CTRLM_RF4CE_LEN_SHUTDOWN_TIME; index++) { + data[index] = (guchar)(shutdown_time >> (index * 8)); + } ctrlm_db_shutdown_time_write(data, CTRLM_RF4CE_LEN_SHUTDOWN_TIME); } guchar ctrlm_property_write_shutdown_time(guchar *data, guchar length) { - if(data == NULL || length != CTRLM_RF4CE_LEN_SHUTDOWN_TIME) { + if(data == NULL || (length != CTRLM_RF4CE_LEN_SHUTDOWN_TIME_LEGACY && length != CTRLM_RF4CE_LEN_SHUTDOWN_TIME)) { XLOGD_ERROR("INVALID PARAMETERS"); return(0); } - time_t shutdown_time = ((data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]); + guint64 shutdown_time_value = 0; + for(guchar index = 0; index < length; index++) { + shutdown_time_value |= ((guint64)data[index] << (index * 8)); + } + time_t shutdown_time = (time_t)shutdown_time_value; if(g_ctrlm.shutdown_time != shutdown_time) { // Store the data From 8836f9fe19801356cdac465e7f27f345a1becb70 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Wed, 12 Aug 2026 10:57:09 -0400 Subject: [PATCH 2/3] fix resource leak on unresponsive shutdown --- src/ctrlm_network.cpp | 47 +++++++++++++++++++++++++------------------ src/ctrlm_network.h | 3 ++- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/ctrlm_network.cpp b/src/ctrlm_network.cpp index fc7035a0..47f6378f 100644 --- a/src/ctrlm_network.cpp +++ b/src/ctrlm_network.cpp @@ -30,6 +30,13 @@ using namespace std; +static void ctrlm_network_term_hal_unref(ctrlm_network_term_hal_t *term_data) { + if(g_atomic_int_dec_and_test(&term_data->ref_count)) { + sem_destroy(&term_data->semaphore); + g_free(term_data); + } +} + void ctrlm_network_property_set(ctrlm_network_id_t network_id, ctrlm_hal_network_property_t property, void *value, guint32 length) { // Allocate a message and send it to Control Manager's queue ctrlm_main_queue_msg_network_property_set_t *msg = (ctrlm_main_queue_msg_network_property_set_t *)g_malloc(sizeof(ctrlm_main_queue_msg_network_property_set_t) + length); @@ -74,10 +81,13 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() { XLOGD_ERROR("Failed to allocate ctrlm_network_term_hal_t"); return; } - sem_t semaphore; - sem_init(&semaphore, 0, 0); + if(sem_init(&term_data->semaphore, 0, 0) != 0) { + XLOGD_ERROR("Failed to initialize termination semaphore"); + g_free(term_data); + return; + } - term_data->semaphore = &semaphore; + g_atomic_int_set(&term_data->ref_count, 2); term_data->term = hal_api_term_; term_data->hal_thread = hal_thread_; @@ -91,7 +101,7 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() { end_time.tv_sec += 5; do { errno = 0; - rc = sem_timedwait(&semaphore, &end_time); + rc = sem_timedwait(&term_data->semaphore, &end_time); if(rc == -1 && errno == EINTR) { XLOGD_INFO("interrupted"); } else { @@ -102,15 +112,14 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() { if(rc != 0) { // no response received XLOGD_INFO("Do NOT wait for thread to exit"); + g_thread_unref(thread_id); } else { - sem_destroy(&semaphore); // Wait for thread to exit XLOGD_INFO("Waiting for thread to exit"); g_thread_join(thread_id); - g_thread_unref(thread_id); XLOGD_INFO("thread exited."); - g_free(term_data); } + ctrlm_network_term_hal_unref(term_data); } #ifdef CTRLM_THUNDER @@ -315,23 +324,21 @@ gpointer ctrlm_obj_network_t::terminate_hal(gpointer data) { if(NULL == term_data->term) { XLOGD_INFO("hal_api_term_ is NULL"); - return NULL; - } - - ctrlm_hal_result_t res = term_data->term(); - if(CTRLM_HAL_RESULT_SUCCESS != res) { - XLOGD_ERROR("HAL req term failed with code <%d>", (int)res); } else { - XLOGD_INFO("HAL terminated successfully"); - } + ctrlm_hal_result_t res = term_data->term(); + if(CTRLM_HAL_RESULT_SUCCESS != res) { + XLOGD_ERROR("HAL req term failed with code <%d>", (int)res); + } else { + XLOGD_INFO("HAL terminated successfully"); + } - if(CTRLM_HAL_RESULT_SUCCESS == res && term_data->hal_thread) { - g_thread_join(term_data->hal_thread); + if(CTRLM_HAL_RESULT_SUCCESS == res && term_data->hal_thread) { + g_thread_join(term_data->hal_thread); + } } - if(term_data->semaphore) { - sem_post(term_data->semaphore); - } + sem_post(&term_data->semaphore); + ctrlm_network_term_hal_unref(term_data); return NULL; } diff --git a/src/ctrlm_network.h b/src/ctrlm_network.h index cb877123..158f18fe 100644 --- a/src/ctrlm_network.h +++ b/src/ctrlm_network.h @@ -163,7 +163,8 @@ typedef struct { } ctrlm_main_queue_msg_network_fw_upgrade_t; typedef struct { - sem_t *semaphore; + gint ref_count; + sem_t semaphore; ctrlm_hal_req_term_t term; GThread *hal_thread; } ctrlm_network_term_hal_t; From a54fadcfd7e971bc74b94144072c81b8b37a9331 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Wed, 12 Aug 2026 11:06:34 -0400 Subject: [PATCH 3/3] fix resource leak for voice settings --- src/voice/ctrlm_voice_obj.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index c3d4e981..886387d2 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -574,8 +574,8 @@ bool ctrlm_voice_t::voice_configure_config_file_json(json_t *obj_voice, json_t * XLOGD_WARN("voice iarm settings is not the correct length, throwing away!"); } else if(voice_settings != NULL) { this->voice_configure(voice_settings, true); // We want to write this to the database now, as this now writes to the new style DB - free(voice_settings); } + ctrlm_db_free((guchar *)voice_settings); } this->set_audio_mode(&audio_settings);