summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Farrell <git@cfware.com>2017-10-05 17:26:14 -0400
committerCorey Farrell <git@cfware.com>2017-10-06 15:54:02 -0500
commitcacf938d38c89da68d306796a139bd117ba0e13d (patch)
treee157cd4882d5b8dc30c58368f216dd31f54bf6d1
parent09932a13efa6719b481aeab0402893de230c1947 (diff)
res_pjsip: Fix leak of persistent endpoint references.
Do not manually call sip_endpoint_apply_handler from load_all_endpoints. This is not necessary and causes memory leaks. Additionally reinitialize persistent->aors when we reuse a persistent object with a new endpoint. ASTERISK-27306 Change-Id: I59bbfc8da8a14d5f4af8c5bb1e71f8592ae823eb
-rw-r--r--res/res_pjsip/pjsip_configuration.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 437476631..a39102305 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1314,6 +1314,14 @@ static struct ast_endpoint *persistent_endpoint_find_or_create(const struct ast_
ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_OFFLINE);
ao2_link_flags(persistent_endpoints, persistent, OBJ_NOLOCK);
+ } else if (strcmp(persistent->aors, endpoint->aors)) {
+ char *new_aors = ast_strdup(endpoint->aors);
+
+ /* make sure we don't NULL persistent->aors if allocation fails. */
+ if (new_aors) {
+ ast_free(persistent->aors);
+ persistent->aors = new_aors;
+ }
}
ao2_ref(persistent->endpoint, +1);
@@ -1790,20 +1798,12 @@ static struct ast_cli_entry cli_commands[] = {
struct ast_sip_cli_formatter_entry *channel_formatter;
struct ast_sip_cli_formatter_entry *endpoint_formatter;
-static int on_load_endpoint(void *obj, void *arg, int flags)
-{
- return sip_endpoint_apply_handler(sip_sorcery, obj);
-}
-
static void load_all_endpoints(void)
{
struct ao2_container *endpoints;
endpoints = ast_sorcery_retrieve_by_fields(sip_sorcery, "endpoint", AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL);
- if (endpoints) {
- ao2_callback(endpoints, OBJ_NODATA, on_load_endpoint, NULL);
- ao2_ref(endpoints, -1);
- }
+ ao2_cleanup(endpoints);
}
int ast_res_pjsip_initialize_configuration(void)