From 57a3f9fe2f56b97d471217a010f06f5b9dc83dc6 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 3 Jul 2023 07:48:03 +0100 Subject: [PATCH] Bugfix when deleting a SDAP entity that is not the first one on the list and prevents segfault when removing the last one on the list Fix delete entity function, a SDAP entity is a combination of a UE and PDUSession, we cannot just simply delete the first entity for a UE --- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 28 ++++++++++++-------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index e81490630c..a0c8f10ada 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -468,23 +468,21 @@ nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id) return NULL; } -void delete_nr_sdap_entity(ue_id_t ue_id) +int nr_sdap_delete_entity(ue_id_t ue_id, int pdusession_id) { - nr_sdap_entity_t *entityPtr, *entityPrev = NULL; - entityPtr = sdap_info.sdap_entity_llist; - - if (entityPtr->ue_id == ue_id) { - sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; - free(entityPtr); - } else { - while (entityPtr->ue_id != ue_id && entityPtr->next_entity != NULL) { - entityPrev = entityPtr; - entityPtr = entityPtr->next_entity; - } - - if (entityPtr->ue_id != ue_id) { - entityPrev->next_entity = entityPtr->next_entity; + nr_sdap_entity_t *entityPtr = sdap_info.sdap_entity_llist; + int pos = 0; + while (entityPtr != NULL) { + if (entityPtr->ue_id == ue_id && entityPtr->pdusession_id == pdusession_id) { + if (pos == 0) { + sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; + } + LOG_I(SDAP, "Deleting SDAP entity for UE %lx and PDU Session id %d\n", ue_id, entityPtr->pdusession_id); free(entityPtr); + return 1; } + entityPtr = entityPtr->next_entity; + pos++; } + return 0; }