diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-02-25 18:38:51 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-02-25 18:38:51 +0000 |
commit | 1d8248c084a76878ecc78cbef78536b5a4512f2a (patch) | |
tree | f316960b9fa320ba6fddf7bdc315f51c72301af6 /channels/chan_agent.c | |
parent | 27101419f11b16bbd1cf771363d548f46a75ffe4 (diff) |
Merged revisions 104086 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r104086 | russell | 2008-02-25 12:38:10 -0600 (Mon, 25 Feb 2008) | 4 lines
Ensure that the channel doesn't disappear in agent_logoff(). If it does, it
could cause a crash.
(fixes the crash reported in BE-396)
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@104087 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_agent.c')
-rw-r--r-- | channels/chan_agent.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 2aeebf5b1..7fce983e4 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -1513,10 +1513,29 @@ static int agent_logoff(const char *agent, int soft) ret = 0; if (p->owner || p->chan) { if (!soft) { - if (p->owner) + ast_mutex_lock(&p->lock); + + while (p->owner && ast_channel_trylock(p->owner)) { + ast_mutex_unlock(&p->lock); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (p->owner) { ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT); - if (p->chan) + ast_channel_unlock(p->owner); + } + + while (p->chan && ast_channel_trylock(p->chan)) { + ast_mutex_unlock(&p->lock); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (p->chan) { ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT); + ast_channel_unlock(p->chan); + } + + ast_mutex_unlock(&p->lock); } else p->deferlogoff = 1; } else { |