From dc6dcc47c34eece006fc8d87ae74bb22fac7e772 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Wed, 9 Apr 2008 17:50:00 +0000 Subject: [PATCH] Merged revisions 113836 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ........ r113836 | mmichelson | 2008-04-09 12:48:33 -0500 (Wed, 09 Apr 2008) | 14 lines There was a subtle logical difference between 1.4 and trunk with regards to how timeouts were handled. In 1.4, if the absolute timeout were reached on a call, no matter what the return value of ast_spawn_extension was, the pbx would attempt to go to the 'T' extension or hangup otherwise. The rearrangement of this function in trunk made this check only happen in the case that ast_spawn_extension returned 0. If ast_spawn_extension returned 1, then the fact that the timeout expired resulted in a no-op, and would cause an infinite loop to occur in __ast_pbx_run. This change fixes this problem. Now timeouts will behave as they did in 1.4 (closes issue #11550) Reported by: pj Tested by: putnopvut ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@113837 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/pbx.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/main/pbx.c b/main/pbx.c index 50f839c0be..f752083b48 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -3499,8 +3499,12 @@ static int __ast_pbx_run(struct ast_channel *c) if (c->_softhangup == AST_SOFTHANGUP_ASYNCGOTO) { c->_softhangup = 0; continue; - } else if (c->_softhangup == AST_SOFTHANGUP_TIMEOUT) { - /* atimeout, nothing bad */ + } else if (c->_softhangup == AST_SOFTHANGUP_TIMEOUT && ast_exists_extension(c, c->context, "T", 1, c->cid.cid_num)) { + set_ext_pri(c, "T", 1); + /* If the AbsoluteTimeout is not reset to 0, we'll get an infinite loop */ + c->whentohangup = 0; + c->_softhangup &= ~AST_SOFTHANGUP_TIMEOUT; + continue; } else { if (c->cdr) ast_cdr_update(c);