stasis: Hangup channel for Local channel No such extension error
authoragupta <abhay@avissol.com>
Fri, 3 May 2019 15:49:31 +0000 (21:19 +0530)
committerJoshua Colp <jcolp@digium.com>
Mon, 6 May 2019 10:27:02 +0000 (04:27 -0600)
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

res/stasis/control.c

index 6bac6e8..d3ea7d7 100644 (file)
@@ -1634,6 +1634,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;
        }