[asterisk-bugs] [JIRA] (ASTERISK-26464) Pickup() semantics changed between 1.4 and 1.8

Walter Doekes (JIRA) noreply at issues.asterisk.org
Thu Oct 13 06:10:01 CDT 2016


Walter Doekes created ASTERISK-26464:
----------------------------------------

             Summary: Pickup() semantics changed between 1.4 and 1.8
                 Key: ASTERISK-26464
                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-26464
             Project: Asterisk
          Issue Type: Bug
      Security Level: None
          Components: Applications/app_directed_pickup
            Reporter: Walter Doekes


Imagine this dialplan:
{noformat}
[incoming]
exten => 200,1,Goto(outgoing,call,1)
exten => *200,1,Goto(pickup,both,1)

[outgoing]
exten => call,1,Dial(SIP/alice)

[pickup]
exten => both,1,Pickup(call at incoming)
exten => both,n,PickupOld1v4(call at outgoing)
{noformat}

Bob calls Alice by calling '200' ({{core show channels}}):

{noformat}
SIP/bob-0000000  call at outgoing:1  Ring     Dial(SIP/alice)
SIP/alice-00000  call at incoming:1  Ringing  AppDial((Outgoing Line))
                      ^
                      |
{noformat}

There is no call at incoming, yet that's what exten+context contain. (I'm not sure if this is a bug or a feature, but it's how it is and tampering with that would probably inflict all sorts of havoc.)

So, when Charlie tries to pick up the call using {{Pickup()}}, we have to use the odd {{call at incoming}} identifier instead of {{call at outgoing}}.

This was unintentionally changed in commit {{cba19c8a671}} (in 2009, merged into what became Asterisk 1.8) when this code got changed:
{noformat}
--- a/apps/app_directed_pickup.c
+++ b/apps/app_directed_pickup.c
...
-static int find_by_exten(struct ast_channel *c, void *data)
-{
-       struct pickup_criteria *info = data;
-
-       return (!strcasecmp(c->macroexten, info->exten) || !strcasecmp(c->exten, info->exten)) &&
-               !strcasecmp(c->dialcontext, info->context) &&
-               can_pickup(c);
-}
...
-       target = ast_channel_search_locked(find_by_exten, &search);
+       if (!(iter = ast_channel_iterator_by_exten_new(0, exten, context))) {
...
{noformat}
Unlike the find_by_exten above, the new iterator uses 'context':
{noformat}
--- a/main/channel.c
+++ b/main/channel.c
...
+                       if (i->context && strcasecmp(chan->context, i->context) &&
+                                       strcasecmp(chan->macrocontext, i->context)) {
...
{noformat}

The check that used the 'dialcontext' now uses the checks used by ast_channel_iterator_by_exten_new; which is 'context'.

This breaks Pickup semantics between pre-1.8 (e.g. Asterisk 1.4) and 1.8 and higher.

----

While I don't think it makes sense to change {{Pickup()}} again, I've filed this ticket for future reference: for those still migrating from Asterisk 1.4 upwards, this could pose an upgrade hurdle.

On the other hand, I don't really see how the *new* semantics are worth anything. Who would use Pickup referencing exten+context where the combination doesn't exist in the dialplan, unless they're intimately familiar with the inner workings?

Attached a patch that adds {{PickupOld1v4()}} with the old semantics.



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list