diff --git a/src/backupSession.c b/src/backupSession.c index ed8b836..916b6a0 100644 --- a/src/backupSession.c +++ b/src/backupSession.c @@ -215,10 +215,8 @@ void bkp_session_simple_insert_in_parent(const char *parent, const char *child, mxml_node_t *bkp_session_insert_event(int index, char *command_key, int id) { - char event_idx[32]; mxml_node_t *b; - snprintf(event_idx, sizeof(event_idx), "%d", index); b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id); if (!b) { struct xml_data_struct bkp_xml_event = {0}; @@ -228,8 +226,9 @@ mxml_node_t *bkp_session_insert_event(int index, char *command_key, int id) int fault = build_xml_node_data(BKP_EVT_BUILD, bkp_tree, &bkp_xml_event); if (fault != CWMP_OK) return NULL; + + b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id); } - b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id); return b; } diff --git a/src/cwmp_event.c b/src/cwmp_event.c index be00c5d..c54984a 100644 --- a/src/cwmp_event.c +++ b/src/cwmp_event.c @@ -17,7 +17,10 @@ static struct event_container *__cwmp_add_event_container(int event_code, const char *command_key) { struct event_container *event_container = NULL; - list_for_each_entry(event_container, &cwmp_ctx.session->events, list) { + struct list_head *ilist; + + list_for_each (ilist, &(cwmp_ctx.session->events)) { + event_container = list_entry(ilist, struct event_container, list); if (event_container->code == event_code) { return event_container; } @@ -30,7 +33,7 @@ static struct event_container *__cwmp_add_event_container(int event_code, const return NULL; } INIT_LIST_HEAD(&(event_container->head_dm_parameter)); - list_add_tail(&(event_container->list), &(cwmp_ctx.session->events)); + list_add(&(event_container->list), ilist->prev); event_container->code = event_code; event_container->command_key = command_key ? strdup(command_key) : strdup(""); event_container->next_session = true; @@ -39,6 +42,7 @@ static struct event_container *__cwmp_add_event_container(int event_code, const } cwmp_ctx.event_id++; event_container->id = cwmp_ctx.event_id; + return event_container; } @@ -54,6 +58,11 @@ void move_next_session_events_to_actual_session() struct list_head *event_container_list = &(cwmp_ctx.session->events); list_for_each_entry (event_container, event_container_list, list) { + // cppcheck-suppress uninitvar + if (cwmp_ctx.session->session_status.is_heartbeat && event_container->code != EVENT_IDX_14HEARTBEAT) + continue; + if ((!cwmp_ctx.session->session_status.is_heartbeat) && (event_container->code == EVENT_IDX_14HEARTBEAT)) + continue; event_container->next_session = false; } } @@ -61,21 +70,21 @@ void move_next_session_events_to_actual_session() int cwmp_remove_all_session_events() { CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__); - struct list_head *events_ptr = cwmp_ctx.session->events.next; - while (events_ptr != &cwmp_ctx.session->events) { - struct event_container *event_container; - event_container = list_entry(events_ptr, struct event_container, list); + struct event_container *event_container = NULL, *node = NULL; + struct list_head *events_container_list = &(cwmp_ctx.session->events); + + list_for_each_entry_safe(event_container, node, events_container_list, list) { if (event_container->code == EVENT_IDX_14HEARTBEAT || event_container->next_session) { - events_ptr = events_ptr->next; continue; } + bkp_session_delete_element("cwmp_event", event_container->id); - free(event_container->command_key); + FREE(event_container->command_key); cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter)); list_del(&(event_container->list)); free(event_container); - events_ptr = cwmp_ctx.session->events.next; } + bkp_session_save(); CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__); return CWMP_OK; @@ -84,29 +93,21 @@ int cwmp_remove_all_session_events() int remove_single_event(int event_code) { CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__); - while (cwmp_ctx.session->events.next != &cwmp_ctx.session->events) { - struct event_container *event_container; - event_container = list_entry(cwmp_ctx.session->events.next, struct event_container, list); - if (event_container->next_session) - continue; - if (event_container->code == event_code) { - bkp_session_delete_element("cwmp_event",event_container->id); - if (event_container->command_key) - free(event_container->command_key); - cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter)); - list_del(&(event_container->list)); - free(event_container); - bkp_session_save(); - break; - } - if (event_container) { - if (event_container->command_key) - free(event_container->command_key); + struct event_container *event_container = NULL, *node = NULL; + struct list_head *events_container_list = &(cwmp_ctx.session->events); + + list_for_each_entry_safe(event_container, node, events_container_list, list) { + if (event_container->code == event_code || !event_container->next_session) { + bkp_session_delete_element("cwmp_event", event_container->id); + FREE(event_container->command_key); cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter)); list_del(&(event_container->list)); free(event_container); } } + + bkp_session_save(); + CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__); return CWMP_OK; }