From f069ee9681b2def71d211ad3ca65db66b7072eef Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 29 May 2013 20:24:18 +0000 Subject: [PATCH] Fix segfault when dealing with chan_agent channels. Check the returned bridged pointer for NULL to avoid a crash. It looks like chan_agent is returning a NULL pointer when it probably should be returning a pointer to the channel the Agent channel is pretending to be. (closes issue ASTERISK-21793) Reported by: Rodrigo P. Telles Patches: jira_asterisk_21793_v1.8.patch (license #5621) patch uploaded by rmudgett Tested by: Rodrigo P. Telles ........ Merged revisions 390044 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 390047 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@390068 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/channel.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main/channel.c b/main/channel.c index d32a8c8834..e9ec45c49a 100644 --- a/main/channel.c +++ b/main/channel.c @@ -6638,14 +6638,14 @@ void ast_channel_set_linkgroup(struct ast_channel *chan, struct ast_channel *pee linkedid = oldest_linkedid(linkedid, ast_channel_uniqueid(peer)); if (ast_channel_internal_bridged_channel(chan)) { bridged = ast_bridged_channel(chan); - if (bridged != peer) { + if (bridged && bridged != peer) { linkedid = oldest_linkedid(linkedid, ast_channel_linkedid(bridged)); linkedid = oldest_linkedid(linkedid, ast_channel_uniqueid(bridged)); } } if (ast_channel_internal_bridged_channel(peer)) { bridged = ast_bridged_channel(peer); - if (bridged != chan) { + if (bridged && bridged != chan) { linkedid = oldest_linkedid(linkedid, ast_channel_linkedid(bridged)); linkedid = oldest_linkedid(linkedid, ast_channel_uniqueid(bridged)); } @@ -6658,13 +6658,13 @@ void ast_channel_set_linkgroup(struct ast_channel *chan, struct ast_channel *pee ast_channel_change_linkedid(peer, linkedid); if (ast_channel_internal_bridged_channel(chan)) { bridged = ast_bridged_channel(chan); - if (bridged != peer) { + if (bridged && bridged != peer) { ast_channel_change_linkedid(bridged, linkedid); } } if (ast_channel_internal_bridged_channel(peer)) { bridged = ast_bridged_channel(peer); - if (bridged != chan) { + if (bridged && bridged != chan) { ast_channel_change_linkedid(bridged, linkedid); } }