[CORE] Check if timer is double free in SBI module

This commit is contained in:
Sukchan Lee 2022-09-03 15:59:39 +09:00
parent acc36a344f
commit c716a1294a
6 changed files with 166 additions and 57 deletions

View File

@ -70,6 +70,12 @@ void ogs_timer_mgr_destroy(ogs_timer_mgr_t *manager)
ogs_free(manager);
}
static ogs_timer_t *ogs_timer_cycle(ogs_timer_mgr_t *manager, ogs_timer_t *timer)
{
ogs_assert(manager);
return ogs_pool_cycle(&manager->pool, timer);
}
ogs_timer_t *ogs_timer_add(
ogs_timer_mgr_t *manager, void (*cb)(void *data), void *data)
{
@ -77,7 +83,11 @@ ogs_timer_t *ogs_timer_add(
ogs_assert(manager);
ogs_pool_alloc(&manager->pool, &timer);
ogs_assert(timer);
if (!timer) {
ogs_fatal("ogs_pool_alloc() failed");
return NULL;
}
ogs_expect_or_return_val(timer, NULL);
memset(timer, 0, sizeof *timer);
timer->cb = cb;
@ -88,19 +98,25 @@ ogs_timer_t *ogs_timer_add(
return timer;
}
void ogs_timer_delete(ogs_timer_t *timer)
void ogs_timer_delete_debug(ogs_timer_t *timer, const char *file_line)
{
ogs_timer_mgr_t *manager;
ogs_assert(timer);
manager = timer->manager;
ogs_assert(manager);
timer = ogs_timer_cycle(manager, timer);
if (!timer) {
ogs_fatal("ogs_timer_delete() failed in %s", file_line);
ogs_assert_if_reached();
}
ogs_timer_stop(timer);
ogs_pool_free(&manager->pool, timer);
}
void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration)
void ogs_timer_start_debug(
ogs_timer_t *timer, ogs_time_t duration, const char *file_line)
{
ogs_timer_mgr_t *manager = NULL;
ogs_assert(timer);
@ -108,6 +124,11 @@ void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration)
manager = timer->manager;
ogs_assert(manager);
timer = ogs_timer_cycle(manager, timer);
if (!timer) {
ogs_fatal("ogs_timer_start() failed in %s", file_line);
ogs_assert_if_reached();
}
if (timer->running == true)
ogs_rbtree_delete(&manager->tree, timer);
@ -116,12 +137,18 @@ void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration)
add_timer_node(&manager->tree, timer, duration);
}
void ogs_timer_stop(ogs_timer_t *timer)
void ogs_timer_stop_debug(ogs_timer_t *timer, const char *file_line)
{
ogs_timer_mgr_t *manager = NULL;
ogs_assert(timer);
manager = timer->manager;
ogs_assert(manager);
timer = ogs_timer_cycle(manager, timer);
ogs_assert(timer);
if (!timer) {
ogs_fatal("ogs_timer_stop() failed in %s", file_line);
ogs_assert_if_reached();
}
if (timer->running == false)
return;
@ -178,4 +205,3 @@ void ogs_timer_mgr_expire(ogs_timer_mgr_t *manager)
this->cb(this->data);
}
}

View File

@ -46,10 +46,17 @@ void ogs_timer_mgr_destroy(ogs_timer_mgr_t *manager);
ogs_timer_t *ogs_timer_add(
ogs_timer_mgr_t *manager, void (*cb)(void *data), void *data);
void ogs_timer_delete(ogs_timer_t *timer);
#define ogs_timer_delete(timer) \
ogs_timer_delete_debug(timer, OGS_FILE_LINE)
void ogs_timer_delete_debug(ogs_timer_t *timer, const char *file_line);
void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration);
void ogs_timer_stop(ogs_timer_t *timer);
#define ogs_timer_start(timer, duration) \
ogs_timer_start_debug(timer, duration, OGS_FILE_LINE)
void ogs_timer_start_debug(
ogs_timer_t *timer, ogs_time_t duration, const char *file_line);
#define ogs_timer_stop(timer) \
ogs_timer_stop_debug(timer, OGS_FILE_LINE)
void ogs_timer_stop_debug(ogs_timer_t *timer, const char *file_line);
ogs_time_t ogs_timer_mgr_next(ogs_timer_mgr_t *manager);
void ogs_timer_mgr_expire(ogs_timer_mgr_t *manager);

View File

@ -106,10 +106,13 @@ ogs_sbi_client_t *ogs_sbi_client_add(ogs_sockaddr_t *addr)
ogs_assert(OGS_OK == ogs_copyaddrinfo(&client->node.addr, addr));
ogs_list_init(&client->connection_list);
client->t_curl = ogs_timer_add(
ogs_app()->timer_mgr, multi_timer_expired, client);
if (!client->t_curl) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&client_pool, client);
return NULL;
}
multi = client->multi = curl_multi_init();
ogs_assert(multi);
@ -122,6 +125,8 @@ ogs_sbi_client_t *ogs_sbi_client_add(ogs_sockaddr_t *addr)
ogs_app()->pool.stream);
#endif
ogs_list_init(&client->connection_list);
ogs_list_add(&ogs_sbi_self()->client_list, client);
return client;

View File

@ -135,7 +135,11 @@ static ogs_sbi_session_t *session_add(ogs_sbi_server_t *server,
sbi_sess->timer = ogs_timer_add(
ogs_app()->timer_mgr, session_timer_expired, sbi_sess);
ogs_assert(sbi_sess->timer);
if (!sbi_sess->timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&session_pool, sbi_sess);
return NULL;
}
/* If User does not send HTTP response within deadline,
* Open5GS will assert this program. */

View File

@ -973,6 +973,14 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id)
ogs_assert(ran_ue);
memset(ran_ue, 0, sizeof *ran_ue);
ran_ue->t_ng_holding = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue);
if (!ran_ue->t_ng_holding) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&ran_ue_pool, ran_ue);
return NULL;
}
ran_ue->index = ogs_pool_index(&ran_ue_pool, ran_ue);
ogs_assert(ran_ue->index > 0 && ran_ue->index <= ogs_app()->max.ue);
@ -989,10 +997,6 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id)
ran_ue->gnb_ostream_id =
OGS_NEXT_ID(gnb->ostream_id, 1, gnb->max_num_of_ostreams-1);
ran_ue->t_ng_holding = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue);
ogs_assert(ran_ue->t_ng_holding);
ran_ue->gnb = gnb;
ogs_list_add(&gnb->ran_ue_list, ran_ue);
@ -1163,6 +1167,56 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
ogs_assert(amf_ue);
memset(amf_ue, 0, sizeof *amf_ue);
/* Add All Timers */
amf_ue->t3513.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue);
if (!amf_ue->t3513.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&amf_ue_pool, amf_ue);
return NULL;
}
amf_ue->t3513.pkbuf = NULL;
amf_ue->t3522.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3522_expire, amf_ue);
if (!amf_ue->t3522.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&amf_ue_pool, amf_ue);
return NULL;
}
amf_ue->t3522.pkbuf = NULL;
amf_ue->t3550.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3550_expire, amf_ue);
if (!amf_ue->t3550.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&amf_ue_pool, amf_ue);
return NULL;
}
amf_ue->t3550.pkbuf = NULL;
amf_ue->t3555.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3555_expire, amf_ue);
if (!amf_ue->t3555.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&amf_ue_pool, amf_ue);
return NULL;
}
amf_ue->t3555.pkbuf = NULL;
amf_ue->t3560.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3560_expire, amf_ue);
if (!amf_ue->t3560.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&amf_ue_pool, amf_ue);
return NULL;
}
amf_ue->t3560.pkbuf = NULL;
amf_ue->t3570.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue);
if (!amf_ue->t3570.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&amf_ue_pool, amf_ue);
return NULL;
}
amf_ue->t3570.pkbuf = NULL;
/* SBI Type */
amf_ue->sbi.type = OGS_SBI_OBJ_UE_TYPE;
@ -1178,26 +1232,6 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
amf_ue->nas.amf.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE;
amf_ue->abba_len = 2;
/* Add All Timers */
amf_ue->t3513.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue);
amf_ue->t3513.pkbuf = NULL;
amf_ue->t3522.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3522_expire, amf_ue);
amf_ue->t3522.pkbuf = NULL;
amf_ue->t3550.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3550_expire, amf_ue);
amf_ue->t3550.pkbuf = NULL;
amf_ue->t3555.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3555_expire, amf_ue);
amf_ue->t3555.pkbuf = NULL;
amf_ue->t3560.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3560_expire, amf_ue);
amf_ue->t3560.pkbuf = NULL;
amf_ue->t3570.timer = ogs_timer_add(
ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue);
amf_ue->t3570.pkbuf = NULL;
amf_ue_fsm_init(amf_ue);
ogs_list_add(&self.amf_ue_list, amf_ue);

View File

@ -1943,6 +1943,14 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id)
ogs_assert(enb_ue);
memset(enb_ue, 0, sizeof *enb_ue);
enb_ue->t_s1_holding = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue);
if (!enb_ue->t_s1_holding) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&enb_ue_pool, enb_ue);
return NULL;
}
enb_ue->index = ogs_pool_index(&enb_ue_pool, enb_ue);
ogs_assert(enb_ue->index > 0 && enb_ue->index <= ogs_app()->max.ue);
@ -1959,10 +1967,6 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id)
enb_ue->enb_ostream_id =
OGS_NEXT_ID(enb->ostream_id, 1, enb->max_num_of_ostreams-1);
enb_ue->t_s1_holding = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue);
ogs_assert(enb_ue->t_s1_holding);
enb_ue->enb = enb;
ogs_list_add(&enb->enb_ue_list, enb_ue);
@ -2047,7 +2051,11 @@ sgw_ue_t *sgw_ue_add(mme_sgw_t *sgw)
sgw_ue->t_s11_holding = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_s11_holding_timer_expire, sgw_ue);
ogs_assert(sgw_ue->t_s11_holding);
if (!sgw_ue->t_s11_holding) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&sgw_ue_pool, sgw_ue);
return NULL;
}
sgw_ue->sgw = sgw;
@ -2259,6 +2267,48 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
ogs_assert(mme_ue);
memset(mme_ue, 0, sizeof *mme_ue);
/* Add All Timers */
mme_ue->t3413.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3413_expire, mme_ue);
if (!mme_ue->t3413.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&mme_ue_pool, mme_ue);
return NULL;
}
mme_ue->t3413.pkbuf = NULL;
mme_ue->t3422.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3422_expire, mme_ue);
if (!mme_ue->t3422.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&mme_ue_pool, mme_ue);
return NULL;
}
mme_ue->t3422.pkbuf = NULL;
mme_ue->t3450.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3450_expire, mme_ue);
if (!mme_ue->t3450.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&mme_ue_pool, mme_ue);
return NULL;
}
mme_ue->t3450.pkbuf = NULL;
mme_ue->t3460.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3460_expire, mme_ue);
if (!mme_ue->t3460.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&mme_ue_pool, mme_ue);
return NULL;
}
mme_ue->t3460.pkbuf = NULL;
mme_ue->t3470.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue);
if (!mme_ue->t3470.timer) {
ogs_error("ogs_timer_add() failed");
ogs_pool_free(&mme_ue_pool, mme_ue);
return NULL;
}
mme_ue->t3470.pkbuf = NULL;
mme_ebi_pool_init(mme_ue);
ogs_list_init(&mme_ue->sess_list);
@ -2290,23 +2340,6 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
mme_ue->csmap = NULL;
mme_ue->vlr_ostream_id = 0;
/* Add All Timers */
mme_ue->t3413.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3413_expire, mme_ue);
mme_ue->t3413.pkbuf = NULL;
mme_ue->t3422.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3422_expire, mme_ue);
mme_ue->t3422.pkbuf = NULL;
mme_ue->t3450.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3450_expire, mme_ue);
mme_ue->t3450.pkbuf = NULL;
mme_ue->t3460.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3460_expire, mme_ue);
mme_ue->t3460.pkbuf = NULL;
mme_ue->t3470.timer = ogs_timer_add(
ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue);
mme_ue->t3470.pkbuf = NULL;
mme_ue_fsm_init(mme_ue);
ogs_list_add(&self.mme_ue_list, mme_ue);