mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-25 15:08:53 +00:00
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
This commit is contained in:
@@ -1315,6 +1315,14 @@ static struct ast_endpoint *persistent_endpoint_find_or_create(const struct ast_
|
|||||||
ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_OFFLINE);
|
ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_OFFLINE);
|
||||||
|
|
||||||
ao2_link_flags(persistent_endpoints, persistent, OBJ_NOLOCK);
|
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);
|
ao2_ref(persistent->endpoint, +1);
|
||||||
@@ -1821,20 +1829,12 @@ static struct ast_cli_entry cli_commands[] = {
|
|||||||
struct ast_sip_cli_formatter_entry *channel_formatter;
|
struct ast_sip_cli_formatter_entry *channel_formatter;
|
||||||
struct ast_sip_cli_formatter_entry *endpoint_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)
|
static void load_all_endpoints(void)
|
||||||
{
|
{
|
||||||
struct ao2_container *endpoints;
|
struct ao2_container *endpoints;
|
||||||
|
|
||||||
endpoints = ast_sorcery_retrieve_by_fields(sip_sorcery, "endpoint", AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL);
|
endpoints = ast_sorcery_retrieve_by_fields(sip_sorcery, "endpoint", AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL);
|
||||||
if (endpoints) {
|
ao2_cleanup(endpoints);
|
||||||
ao2_callback(endpoints, OBJ_NODATA, on_load_endpoint, NULL);
|
|
||||||
ao2_ref(endpoints, -1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_res_pjsip_initialize_configuration(void)
|
int ast_res_pjsip_initialize_configuration(void)
|
||||||
|
Reference in New Issue
Block a user