Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 333499) +++ channels/chan_sip.c (working copy) @@ -6091,7 +6091,7 @@ if (!p) { ast_debug(1, "Asked to hangup channel that was not connected\n"); - return 0; + return -1; } if (ast_test_flag(ast, AST_FLAG_ANSWERED_ELSEWHERE) || ast->hangupcause == AST_CAUSE_ANSWERED_ELSEWHERE) { ast_debug(1, "This call was answered elsewhere"); Index: main/channel.c =================================================================== --- main/channel.c (revision 333499) +++ main/channel.c (working copy) @@ -6480,6 +6480,9 @@ /* Start by disconnecting the original's physical side */ if (clonechan->tech->hangup && clonechan->tech->hangup(clonechan)) { ast_log(LOG_WARNING, "Hangup failed! Strange things may happen!\n"); + ast_channel_unlock(clonechan); + ast_hangup(clonechan); + clonechan = NULL; res = -1; goto done; } Index: main/features.c =================================================================== --- main/features.c (revision 333499) +++ main/features.c (working copy) @@ -6925,7 +6925,7 @@ int ast_can_pickup(struct ast_channel *chan) { - if (!chan->pbx && !chan->masq && !ast_test_flag(chan, AST_FLAG_ZOMBIE) + if (chan->tech_pvt && !chan->pbx && !chan->masq && !ast_test_flag(chan, AST_FLAG_ZOMBIE) && (chan->_state == AST_STATE_RINGING || chan->_state == AST_STATE_RING /*