app_queue: track masquerades in app_queue to avoid leaked stasis subscriptions

Add a new "masquarade" channel event, and use it in app_queue to track unique id's.

Testcase is submitted as https://gerrit.asterisk.org/c/testsuite/+/14210

ASTERISK-28829 #close
ASTERISK-25844 #close

Change-Id: Ifc5f9f9fd70903f3c6e49738d3bc632b085d2df6
This commit is contained in:
Nathan Bruning
2020-04-09 01:41:55 +02:00
committed by Joshua Colp
parent 44e5dd288b
commit f217fcdc62
4 changed files with 45 additions and 0 deletions

View File

@@ -6449,6 +6449,33 @@ static void handle_hangup(void *userdata, struct stasis_subscription *sub,
remove_stasis_subscriptions(queue_data);
}
static void handle_masquerade(void *userdata, struct stasis_subscription *sub,
struct stasis_message *msg)
{
struct queue_stasis_data *queue_data = userdata;
struct ast_channel_blob *channel_blob = stasis_message_data(msg);
const char *new_channel_id;
new_channel_id = ast_json_string_get(ast_json_object_get(channel_blob->blob, "newchanneluniqueid"));
ao2_lock(queue_data);
if (queue_data->dying) {
ao2_unlock(queue_data);
return;
}
if (!strcmp(channel_blob->snapshot->base->uniqueid, queue_data->caller_uniqueid)) {
ast_debug(1, "Replacing caller channel %s with %s due to masquerade\n", queue_data->caller_uniqueid, new_channel_id);
ast_string_field_set(queue_data, caller_uniqueid, new_channel_id);
} else if (!strcmp(channel_blob->snapshot->base->uniqueid, queue_data->member_uniqueid)) {
ast_debug(1, "Replacing member channel %s with %s due to masquerade\n", queue_data->member_uniqueid, new_channel_id);
ast_string_field_set(queue_data, member_uniqueid, new_channel_id);
}
ao2_unlock(queue_data);
}
/*!
* \internal
* \brief Callback for all stasis channel events
@@ -6522,6 +6549,8 @@ static int setup_stasis_subs(struct queue_ent *qe, struct ast_channel *peer, str
handle_local_optimization_end, queue_data);
stasis_message_router_add(queue_data->channel_router, ast_channel_hangup_request_type(),
handle_hangup, queue_data);
stasis_message_router_add(queue_data->channel_router, ast_channel_masquerade_type(),
handle_masquerade, queue_data);
stasis_message_router_set_default(queue_data->channel_router,
queue_channel_cb, queue_data);