diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-06-03 16:24:08 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-06-03 16:24:08 +0000 |
commit | 05db8dd8b82abca288962d3d17cb023232cb08e1 (patch) | |
tree | cdf75c338e22f64596361aa41e5a8f6a2dd64854 /channels/chan_iax2.c | |
parent | 48988bb38d1f71a4aac7bdde30a3ae006ef86a19 (diff) |
Merged revisions 120012 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r120012 | tilghman | 2008-06-03 11:19:35 -0500 (Tue, 03 Jun 2008) | 17 lines
Merged revisions 120001 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r120001 | tilghman | 2008-06-03 11:10:53 -0500 (Tue, 03 Jun 2008) | 9 lines
Save the callno when we're poking, because our peer structure could change
during destruction (and thus we unlock the wrong callno, causing a
cascade failure).
(closes issue #12717)
Reported by: gewfie
Patches:
20080525__bug12717.diff.txt uploaded by Corydon76 (license 14)
Tested by: gewfie
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@120034 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r-- | channels/chan_iax2.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 059152599..56de8faf1 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -9740,6 +9740,7 @@ static int iax2_poke_peer_cb(void *obj, void *arg, int flags) static int iax2_poke_peer(struct iax2_peer *peer, int heldcall) { + int callno; if (!peer->maxms || (!peer->addr.sin_addr.s_addr && !peer->dnsmgr)) { /* IF we have no IP without dnsmgr, or this isn't to be monitored, return immediately after clearing things out */ @@ -9749,11 +9750,13 @@ static int iax2_poke_peer(struct iax2_peer *peer, int heldcall) peer->callno = 0; return 0; } - if (peer->callno > 0) { + + /* The peer could change the callno inside iax2_destroy, since we do deadlock avoidance */ + if ((callno = peer->callno) > 0) { ast_log(LOG_NOTICE, "Still have a callno...\n"); - ast_mutex_lock(&iaxsl[peer->callno]); - iax2_destroy(peer->callno); - ast_mutex_unlock(&iaxsl[peer->callno]); + ast_mutex_lock(&iaxsl[callno]); + iax2_destroy(callno); + ast_mutex_unlock(&iaxsl[callno]); } if (heldcall) ast_mutex_unlock(&iaxsl[heldcall]); |