From 1d73d850dab8aac9e46c7b8e98c6e290c6d5fcc8 Mon Sep 17 00:00:00 2001 From: Carsten Date: Wed, 28 May 2025 11:10:39 +0200 Subject: [PATCH] Create a lock around inbound requests --- .vscode/settings.json | 10 ++++++++++ modules/aaa_diameter/dm_impl.c | 5 +++++ modules/aaa_diameter/dm_impl.h | 1 + modules/aaa_diameter/dm_peer.c | 1 + 4 files changed, 17 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..2dd9ebccfc9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "files.associations": { + "usrloc.h": "c", + "parse_fline.h": "c", + "common.h": "c", + "data_lump.h": "c", + "digest.h": "c", + "regtime.h": "c" + } +} \ No newline at end of file diff --git a/modules/aaa_diameter/dm_impl.c b/modules/aaa_diameter/dm_impl.c index 3cc9d9e9037..a9d22058185 100644 --- a/modules/aaa_diameter/dm_impl.c +++ b/modules/aaa_diameter/dm_impl.c @@ -53,6 +53,7 @@ struct fd_msg_list { * to consume them */ struct list_head dm_unreplied_req; gen_lock_t dm_unreplied_req_lk; +gen_lock_t dm_inbound_req_lk; unsigned int dm_unreplied_req_timeout = 120; /* sec */ @@ -536,6 +537,8 @@ static int dm_receive_req(struct msg **_req, struct avp * avp, struct session * struct msg_hdr *hdr = NULL; str tid = STR_NULL, avp_arr = STR_NULL; + lock_get(&dm_inbound_req_lk); + FD_CHECK(fd_msg_hdr(req, &hdr)); LM_DBG("received Diameter request (appl: %u, cmd: %u)\n", hdr->msg_appl, hdr->msg_code); @@ -603,6 +606,8 @@ static int dm_receive_req(struct msg **_req, struct avp * avp, struct session * cJSON_Delete(avps); cJSON_InitHooks(NULL); + lock_release(&dm_inbound_req_lk); + *_req = NULL; *act = DISP_ACT_CONT; return 0; diff --git a/modules/aaa_diameter/dm_impl.h b/modules/aaa_diameter/dm_impl.h index 2de25d5fae8..ff64edf4d72 100644 --- a/modules/aaa_diameter/dm_impl.h +++ b/modules/aaa_diameter/dm_impl.h @@ -144,6 +144,7 @@ int init_mutex_cond(pthread_mutex_t *mutex, pthread_cond_t *cond); extern struct list_head dm_unreplied_req; extern gen_lock_t dm_unreplied_req_lk; +extern gen_lock_t dm_inbound_req_lk; extern unsigned int dm_unreplied_req_timeout; extern char *dm_conf_filename; extern char *extra_avps_file; diff --git a/modules/aaa_diameter/dm_peer.c b/modules/aaa_diameter/dm_peer.c index 2484ecfc164..5ad7778e88a 100644 --- a/modules/aaa_diameter/dm_peer.c +++ b/modules/aaa_diameter/dm_peer.c @@ -66,6 +66,7 @@ int dm_init_peer(void) INIT_LIST_HEAD(&dm_unreplied_req); lock_init(&dm_unreplied_req_lk); + lock_init(&dm_inbound_req_lk); return 0; }