stasis: Hangup channel for Local channel No such extension error

When we use early bridge with create and dial from stasis using Local channel
and the dialplan does not any entry the it is returned from core_local.c with
No such extension .

In such case asterisk locks up till the channel is not hangup with the error
Exceptionally long voice queue length

* Found that in such case app_control_dial fails on ast_call method and
  return -1
* Since it is called from stasis_app_send_command_async and return -1 does
  not cause resources to be freed and since no PBX exist it is not able to
  read from channel causing exceptionally long queue
* After putting this code found that the channel was releasing immediately
  and resources were freed.

ASTERISK-28399
Reported by: Abhay Gupta
Tested by: Abhay Gupta

Change-Id: I0a55c923fc6995559f808d63b9488762b4489318
This commit is contained in:
agupta 2019-05-03 21:19:31 +05:30 committed by Joshua Colp
parent 8357ab7e9a
commit 9a0fa51443
1 changed files with 11 additions and 0 deletions

View File

@ -1649,6 +1649,17 @@ static int app_control_dial(struct stasis_app_control *control,
}
if (ast_call(chan, args->dialstring, 0)) {
/* If call fails normally this channel would then just be normally hung up and destroyed.
* In this case though the channel is being handled by the ARI control thread and dial
* bridge which needs to be notified that the channel should be hung up. To do this we
* queue a soft hangup which will cause each to wake up, see that the channel has been
* hung up, and then destroy it.
*/
int hangup_flag;
hangup_flag = ast_bridge_setup_after_goto(chan) ? AST_SOFTHANGUP_DEV : AST_SOFTHANGUP_ASYNCGOTO;
ast_channel_lock(chan);
ast_softhangup_nolock(chan, hangup_flag);
ast_channel_unlock(chan);
return -1;
}