[asterisk-dev] [Code Review] Fix broken redirect out of MeetMe() as well as the deeper issue at hand
Russell Bryant
reviewboard at asterisk.org
Mon Jan 24 12:51:58 CST 2011
> On 2011-01-24 11:01:25, rmudgett wrote:
> > The features.c:check_goto_on_transfer() is setting _softhangup to zero after doing ast_parseable_goto(). I do not think there will be any hangup flags set at that point though since it is not an async goto.
Thanks. I don't know why I missed that. Fixed.
> On 2011-01-24 11:01:25, rmudgett wrote:
> > /branches/1.8/main/channel.c, lines 2611-2624
> > <https://reviewboard.asterisk.org/r/1082/diff/2/?file=15268#file15268line2611>
> >
> > You do not need to traverse the list. The END_OF_Q is either the last item in the list or it is not there.
> >
> > Look at __ast_queue_frame(). It uses AST_LIST_LAST() and AST_LIST_REMOVE().
Good point, fixed.
- Russell
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/1082/#review3123
-----------------------------------------------------------
On 2011-01-21 17:17:51, Russell Bryant wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/1082/
> -----------------------------------------------------------
>
> (Updated 2011-01-21 17:17:51)
>
>
> Review request for Asterisk Developers.
>
>
> Summary
> -------
>
> Mantis issue #18585 reports that a channel redirect out of MeetMe() stopped working properly. This issue includes a patch that resolves the issue by removing a call to ast_check_hangup() from app_meetme.c. I left that in my patch, as it doesn't need to be there. However, the rest of the patch fixes this problem with or without the change to app_meetme.
>
> The key difference between what happens before and after this patch is the effect of the END_OF_Q control frame. After END_OF_Q is hit in ast_read(), ast_read() will return NULL. With the ast_check_hangup() removed, app_meetme sees this which causes it to exit as intended. Checking ast_check_hangup() caused app_meetme to exit earlier in the process, and the target of the redirect saw the condition where ast_read() returned NULL.
>
> Removing ast_check_hangup() works around the issue in app_meetme, but doesn't solve the issue if another application did the same thing. There are also other edge cases where if an application finishes at the same time that a redirect happens, the target of the redirect will think that the channel hung up. So, I made some changes in pbx.c to resolve it at a deeper level. There are already places that unset the SOFTHANGUP_ASYNCGOTO flag in an attempt to abort the hangup process. My patch extends this to remove the END_OF_Q frame from the channel's read queue, making the "abort hangup" more complete.
>
>
> This addresses bug 18585.
> https://issues.asterisk.org/view.php?id=18585
>
>
> Diffs
> -----
>
> /branches/1.8/apps/app_meetme.c 303376
> /branches/1.8/include/asterisk/channel.h 303376
> /branches/1.8/main/channel.c 303376
> /branches/1.8/main/pbx.c 303376
>
> Diff: https://reviewboard.asterisk.org/r/1082/diff
>
>
> Testing
> -------
>
> I replicated the bug easily. I verified that removing ast_check_hangup() fixes the issue and determined why it fixes it. I also verified that the issue is resolved with the pbx.c changes, both with and without ast_check_hangup() still used in app_meetme.
>
>
> Thanks,
>
> Russell
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20110124/7be72654/attachment.htm>
More information about the asterisk-dev
mailing list