Module: kamailio Branch: 6.0 Commit: 4c6485235ab6a66e45ab20be731dd4f220e36e44 URL: https://github.com/kamailio/kamailio/commit/4c6485235ab6a66e45ab20be731dd4f2...
Author: Victor Seva linuxmaniac@torreviejawireless.org Committer: Victor Seva linuxmaniac@torreviejawireless.org Date: 2025-07-29T11:34:04+02:00
ims_ipsec_pcscf: ipsec_reconfig() fix logic
reconfig should only happen once. Before, if more than one REGISTER was processed when there are no contacts, the process could be triggered more than once.
(cherry picked from commit c362531c5dccc3ed674247c18bac65c224385108)
---
Modified: src/modules/ims_ipsec_pcscf/cmd.c Modified: src/modules/ims_ipsec_pcscf/ims_ipsec_pcscf_mod.c
---
Diff: https://github.com/kamailio/kamailio/commit/4c6485235ab6a66e45ab20be731dd4f2... Patch: https://github.com/kamailio/kamailio/commit/4c6485235ab6a66e45ab20be731dd4f2...
---
diff --git a/src/modules/ims_ipsec_pcscf/cmd.c b/src/modules/ims_ipsec_pcscf/cmd.c index 4672a45906a..8871a76c6b4 100644 --- a/src/modules/ims_ipsec_pcscf/cmd.c +++ b/src/modules/ims_ipsec_pcscf/cmd.c @@ -69,6 +69,7 @@ extern ip_addr_t ipsec_listen_ip_addr6;
extern int spi_id_start;
+extern atomic_t *ipsec_reconfig_flag; extern unsigned int ipsec_init_flag;
// check http://www.asipto.com/pub/kamailio-devel-guide/#c16return_values @@ -1375,15 +1376,25 @@ int ipsec_destroy_by_contact(
int ipsec_reconfig() { + int ret; + if(ul.get_number_of_contacts() != 0) { return 0; }
+ if(atomic_get(ipsec_reconfig_flag) != 0) { + LM_DBG("reconfig already called\n"); + return 0; + } + atomic_set(ipsec_reconfig_flag, 1); + if(clean_spi_list() != 0) { return 1; }
- return ipsec_cleanall(); + ret = ipsec_cleanall(); + atomic_set(ipsec_reconfig_flag, 0); + return ret; }
int ipsec_cleanall() diff --git a/src/modules/ims_ipsec_pcscf/ims_ipsec_pcscf_mod.c b/src/modules/ims_ipsec_pcscf/ims_ipsec_pcscf_mod.c index 72bd381a587..0f1700a55d3 100644 --- a/src/modules/ims_ipsec_pcscf/ims_ipsec_pcscf_mod.c +++ b/src/modules/ims_ipsec_pcscf/ims_ipsec_pcscf_mod.c @@ -24,6 +24,7 @@ * */
+#include "../../core/atomic_ops.h" #include "../../core/sr_module.h" #include "../../core/mod_fix.h" #include "../../modules/tm/tm_load.h" @@ -75,6 +76,7 @@ static int unregister_fixup_free(void **param, int param_no); extern int bind_ipsec_pcscf(usrloc_api_t *api);
unsigned int ipsec_init_flag = 0; +atomic_t *ipsec_reconfig_flag = NULL;
/* clang-format off */
@@ -407,6 +409,11 @@ static int mod_init(void) return -1; }
+ if((ipsec_reconfig_flag = shm_malloc(sizeof(atomic_t))) == NULL) { + SHM_MEM_ERROR; + return -1; + } + atomic_set(ipsec_reconfig_flag, 0); ipsec_init_flag = 1;
return 0; @@ -421,6 +428,10 @@ static void mod_destroy(void) if(destroy_spi_gen() != 0) { LM_ERR("Error destroying spi generator\n"); } + + if(ipsec_reconfig_flag) { + shm_free(ipsec_reconfig_flag); + } }
static int child_init(int rank)