src/base/sysf_tmr.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)
Fix memory leak in ncs_tmr_add_pat_node() Fix timer state, so that the timer will not execute if ncs_tmr_start() fails diff --git a/src/base/sysf_tmr.c b/src/base/sysf_tmr.c --- a/src/base/sysf_tmr.c +++ b/src/base/sysf_tmr.c @@ -180,6 +180,7 @@ static struct timespec ts_start; static uint32_t ncs_tmr_add_pat_node(SYSF_TMR *tmr) { SYSF_TMR_PAT_NODE *temp_tmr_pat_node = NULL; + int rc; temp_tmr_pat_node = (SYSF_TMR_PAT_NODE *)ncs_patricia_tree_get(&gl_tcb.tmr_pat_tree, (uint8_t *)&tmr->key); @@ -190,7 +191,11 @@ static uint32_t ncs_tmr_add_pat_node(SYS memset(temp_tmr_pat_node, '\0', sizeof(SYSF_TMR_PAT_NODE)); temp_tmr_pat_node->key = tmr->key; temp_tmr_pat_node->pat_node.key_info = (uint8_t *)&temp_tmr_pat_node->key; - ncs_patricia_tree_add(&gl_tcb.tmr_pat_tree, (NCS_PATRICIA_NODE *)&temp_tmr_pat_node->pat_node); + rc = ncs_patricia_tree_add(&gl_tcb.tmr_pat_tree, (NCS_PATRICIA_NODE *)&temp_tmr_pat_node->pat_node); + if(rc != NCSCC_RC_SUCCESS) { + m_NCS_MEM_FREE(temp_tmr_pat_node, NCS_MEM_REGION_PERSISTENT, NCS_SERVICE_ID_LEAP_TMR, 0); + return NCSCC_RC_FAILURE; + } } if (temp_tmr_pat_node->tmr_list_start == NULL) { @@ -733,6 +738,8 @@ tmr_t ncs_tmr_start(tmr_t tid, int64_t t on the "sel_obj". */ if (m_NCS_SEL_OBJ_IND(&gl_tcb.sel_obj) != NCSCC_RC_SUCCESS) { /* We would never reach here! */ + /* Ignore this timer. Indication was not successfully sent */ + TMR_SET_STATE(tmr, TMR_STATE_DESTROY); m_NCS_UNLOCK(&gl_tcb.safe.enter_lock, NCS_LOCK_WRITE); m_LEAP_DBG_SINK_VOID; return NULL; ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel