res_pjsip_outbound_registration: Clean up state when registration is deleted
Nothing was cleaning up the registration state object when ast_sorcery_delete was called on a registration. So, the registration was deleted from sorcery but the state object went right on refreshing the registration (or failing to refresh the registration) with the peer. * Added a 'deleted' observer on registration that removes the state object. ASTERISK-25964 #close Reported-by Matt Jordan Change-Id: I2db792145cdb1f72ebbf57dd9099596dbbf12c23
This commit is contained in:
parent
040522100b
commit
ae81b55361
|
@ -1912,6 +1912,26 @@ static const struct ast_sorcery_instance_observer observer_callbacks_registratio
|
||||||
.object_type_loaded = registration_loaded_observer,
|
.object_type_loaded = registration_loaded_observer,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void registration_deleted_observer(const void *obj)
|
||||||
|
{
|
||||||
|
const struct sip_outbound_registration *registration = obj;
|
||||||
|
struct ao2_container *states;
|
||||||
|
|
||||||
|
states = ao2_global_obj_ref(current_states);
|
||||||
|
if (!states) {
|
||||||
|
/* Global container has gone. Likely shutting down. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ao2_find(states, ast_sorcery_object_get_id(registration), OBJ_UNLINK | OBJ_NODATA | OBJ_SEARCH_KEY);
|
||||||
|
|
||||||
|
ao2_ref(states, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ast_sorcery_observer registration_observer = {
|
||||||
|
.deleted = registration_deleted_observer,
|
||||||
|
};
|
||||||
|
|
||||||
static int unload_module(void)
|
static int unload_module(void)
|
||||||
{
|
{
|
||||||
int remaining;
|
int remaining;
|
||||||
|
@ -2011,7 +2031,9 @@ static int load_module(void)
|
||||||
if (ast_sorcery_instance_observer_add(ast_sip_get_sorcery(),
|
if (ast_sorcery_instance_observer_add(ast_sip_get_sorcery(),
|
||||||
&observer_callbacks_registrations)
|
&observer_callbacks_registrations)
|
||||||
|| ast_sorcery_observer_add(ast_sip_get_sorcery(), "auth",
|
|| ast_sorcery_observer_add(ast_sip_get_sorcery(), "auth",
|
||||||
&observer_callbacks_auth)) {
|
&observer_callbacks_auth)
|
||||||
|
|| ast_sorcery_observer_add(ast_sip_get_sorcery(), "registration",
|
||||||
|
®istration_observer)) {
|
||||||
ast_log(LOG_ERROR, "Unable to register observers.\n");
|
ast_log(LOG_ERROR, "Unable to register observers.\n");
|
||||||
unload_module();
|
unload_module();
|
||||||
return AST_MODULE_LOAD_FAILURE;
|
return AST_MODULE_LOAD_FAILURE;
|
||||||
|
|
Loading…
Reference in New Issue