From 194d1bd1d1b86a92ee51bb32d88c105eb6130910 Mon Sep 17 00:00:00 2001 From: Alex Hermann Date: Mon, 2 Jan 2017 19:21:19 +0100 Subject: [PATCH 1/6] cfgutils: Add fixup_free functions to (u)sleep functions --- src/modules/cfgutils/cfgutils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/cfgutils/cfgutils.c b/src/modules/cfgutils/cfgutils.c index ca7bf77ae38..d028a30918d 100644 --- a/src/modules/cfgutils/cfgutils.c +++ b/src/modules/cfgutils/cfgutils.c @@ -134,9 +134,9 @@ static cmd_export_t cmds[]={ ANY_ROUTE}, {"rand_event", (cmd_function)rand_event, 0, 0, 0, ANY_ROUTE}, - {"sleep", (cmd_function)m_sleep, 1, fixup_igp_null, 0, + {"sleep", (cmd_function)m_sleep, 1, fixup_igp_null, fixup_free_igp_null, ANY_ROUTE}, - {"usleep", (cmd_function)m_usleep, 1, fixup_igp_null, 0, + {"usleep", (cmd_function)m_usleep, 1, fixup_igp_null, fixup_free_igp_null, ANY_ROUTE}, {"abort", (cmd_function)dbg_abort, 0, 0, 0, ANY_ROUTE}, From 92e404b3676aa57bca531096cddc14d58e06c789 Mon Sep 17 00:00:00 2001 From: Alex Hermann Date: Mon, 2 Jan 2017 19:22:03 +0100 Subject: [PATCH 2/6] cfgutils: Allow pv in check_route_exists() and route_if_exists() These functions are somewhat useless if a dynamic parameter is not allowed. --- src/modules/cfgutils/cfgutils.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/modules/cfgutils/cfgutils.c b/src/modules/cfgutils/cfgutils.c index d028a30918d..d8828ce5746 100644 --- a/src/modules/cfgutils/cfgutils.c +++ b/src/modules/cfgutils/cfgutils.c @@ -162,9 +162,9 @@ static cmd_export_t cmds[]={ ANY_ROUTE}, {"core_hash", (cmd_function)w_core_hash, 3, fixup_core_hash, 0, ANY_ROUTE}, - {"check_route_exists", (cmd_function)w_check_route_exists, 1, 0, 0, + {"check_route_exists", (cmd_function)w_check_route_exists, 1, fixup_spve_null, fixup_free_spve_null, ANY_ROUTE}, - {"route_if_exists", (cmd_function)w_route_exists, 1, 0, 0, + {"route_if_exists", (cmd_function)w_route_exists, 1, fixup_spve_null, fixup_free_spve_null, ANY_ROUTE}, {"bind_cfgutils", (cmd_function)bind_cfgutils, 0, 0, 0, 0}, @@ -784,7 +784,14 @@ static int w_cfg_trylock(struct sip_msg *msg, char *key, char *s2) */ static int w_check_route_exists(struct sip_msg *msg, char *route) { - if (route_lookup(&main_rt, route)<0) { + str s; + + if (fixup_get_svalue(msg, (gparam_p) route, &s) != 0) + { + LM_ERR("invalid route parameter\n"); + return -1; + } + if (route_lookup(&main_rt, s.s)<0) { /* not found */ return -1; } @@ -797,8 +804,15 @@ static int w_route_exists(struct sip_msg *msg, char *route) { struct run_act_ctx ctx; int newroute, backup_rt, ret; + str s; + + if (fixup_get_svalue(msg, (gparam_p) route, &s) != 0) + { + LM_ERR("invalid route parameter\n"); + return -1; + } - newroute = route_lookup(&main_rt, route); + newroute = route_lookup(&main_rt, s.s); if (newroute<0) { return -1; } From d6a374d707f23afddfc007edfeae40b01836b3c0 Mon Sep 17 00:00:00 2001 From: Alex Hermann Date: Mon, 20 Feb 2017 18:26:01 +0100 Subject: [PATCH 3/6] cfgutils: Properly handle 'exit' when from route_if_exists() exit is supposed to exit the routing script. route_if_exists() wasn't handling the exit, so script would continue to run after 'exit'. --- src/modules/cfgutils/cfgutils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/cfgutils/cfgutils.c b/src/modules/cfgutils/cfgutils.c index d8828ce5746..c2fc404c56f 100644 --- a/src/modules/cfgutils/cfgutils.c +++ b/src/modules/cfgutils/cfgutils.c @@ -818,9 +818,13 @@ static int w_route_exists(struct sip_msg *msg, char *route) } backup_rt = get_route_type(); set_route_type(REQUEST_ROUTE); + init_run_actions_ctx(&ctx); ret = run_top_route(main_rt.rlist[newroute], msg, &ctx); set_route_type(backup_rt); + if (ctx.run_flags & EXIT_R_F) { + return 0; + } return ret; } From efe9d554a912edb0ffc5ae8e7176adc5bcc44a5e Mon Sep 17 00:00:00 2001 From: Alex Hermann Date: Tue, 6 Oct 2015 12:35:38 +0200 Subject: [PATCH 4/6] cfgutils: Remove debug statements in sleep functions Too much noise when debug logging is on --- src/modules/cfgutils/cfgutils.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modules/cfgutils/cfgutils.c b/src/modules/cfgutils/cfgutils.c index c2fc404c56f..4a3e001e6e1 100644 --- a/src/modules/cfgutils/cfgutils.c +++ b/src/modules/cfgutils/cfgutils.c @@ -622,7 +622,6 @@ static int m_sleep(struct sip_msg *msg, char *time, char *str2) LM_ERR("cannot get time interval value\n"); return -1; } - LM_DBG("sleep %lu seconds\n", (unsigned long)s); sleep((unsigned int)s); return 1; } @@ -635,7 +634,6 @@ static int m_usleep(struct sip_msg *msg, char *time, char *str2) LM_ERR("cannot get time interval value\n"); return -1; } - LM_DBG("sleep %lu microseconds\n", (unsigned long)time); sleep_us((unsigned int)s); return 1; } From 305dbe7197f87d8e14bb75f14553852c8e3c9b8c Mon Sep 17 00:00:00 2001 From: Alex Hermann Date: Mon, 20 Feb 2017 18:30:27 +0100 Subject: [PATCH 5/6] json: Add fixup_free function for json_get_field --- src/modules/json/json_mod.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/json/json_mod.c b/src/modules/json/json_mod.c index b20299efe9d..ec7a5fced33 100644 --- a/src/modules/json/json_mod.c +++ b/src/modules/json/json_mod.c @@ -82,7 +82,7 @@ static int fixup_get_field(void** param, int param_no) static int fixup_get_field_free(void** param, int param_no) { if (param_no == 1 || param_no == 2) { - LM_WARN("free function has not been defined for spve\n"); + fixup_free_spve_null(param, 1); return 0; } From 894e64ae69f485ee8b764092d255c65ab7740da7 Mon Sep 17 00:00:00 2001 From: Alex Hermann Date: Fri, 24 Feb 2017 14:23:57 +0100 Subject: [PATCH 6/6] janssonrcp-c: Fix segfault in mod_destroy Check variable before dereferencing it. --- src/modules/janssonrpcc/janssonrpcc_mod.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/janssonrpcc/janssonrpcc_mod.c b/src/modules/janssonrpcc/janssonrpcc_mod.c index a6e9c010d30..5cdd5f8a5bc 100644 --- a/src/modules/janssonrpcc/janssonrpcc_mod.c +++ b/src/modules/janssonrpcc/janssonrpcc_mod.c @@ -205,8 +205,10 @@ static int child_init(int rank) void mod_destroy(void) { - lock_get(jsonrpc_server_group_lock); /* blocking */ - if(jsonrpc_server_group_lock) lock_dealloc(jsonrpc_server_group_lock); + if(jsonrpc_server_group_lock) { + lock_get(jsonrpc_server_group_lock); /* blocking */ + lock_dealloc(jsonrpc_server_group_lock); + } free_server_group(global_server_group); CHECK_AND_FREE(global_server_group);