Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 129342) +++ channels/chan_sip.c (working copy) @@ -5064,8 +5064,10 @@ int fmt; const char *codec; + ast_channel_lock(p->owner); codec = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC"); - if (!codec) + if (!codec) + ast_channel_unlock(p->owner); return; fmt = ast_getformatbyname(codec); @@ -5078,6 +5080,7 @@ ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because it is not shared by both ends.\n"); } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n", codec); + ast_channel_unlock(p->owner); return; } @@ -11383,6 +11386,7 @@ referdata->referred_by[0] = '\0'; } + ast_channel_lock(transferer->owner); /* Determine transfer context */ if (transferer->owner) /* Mimic behaviour in res_features.c */ transfer_context = pbx_builtin_getvar_helper(transferer->owner, "TRANSFER_CONTEXT"); @@ -11405,7 +11409,9 @@ } if (sip_debug_test_pvt(transferer)) ast_verbose("Failed SIP Transfer to non-existing extension %s in context %s\n n", refer_to, transfer_context); - + + ast_channel_unlock(transferer->owner); + /* Failure, we can't find this extension */ return -1; } @@ -11450,6 +11456,7 @@ if (sip_debug_test_pvt(p)) ast_verbose("Looking for %s in %s\n", c, p->context); + ast_channel_lock(p->owner); if (p->owner) /* Mimic behaviour in res_features.c */ transfer_context = pbx_builtin_getvar_helper(p->owner, "TRANSFER_CONTEXT"); @@ -11471,7 +11478,7 @@ } else if (ast_canmatch_extension(NULL, p->context, c, 1, NULL)) { return 1; } - + ast_channel_unlock(p->owner); return -1; } @@ -17449,6 +17456,8 @@ /* If we are performing an attended transfer and we have two channels involved then copy sound file information to play upon attended transfer completion */ if (target.chan2) { + ast_channel_lock(target.chan1); + ast_channel_lock(target.chan2); const char *chan1_attended_sound = pbx_builtin_getvar_helper(target.chan1, "ATTENDED_TRANSFER_COMPLETE_SOUND"), *chan2_attended_sound = pbx_builtin_getvar_helper(target.chan2, "ATTENDED_TRANSFER_COMPLETE_SOUND"); if (!ast_strlen_zero(chan1_attended_sound)) { pbx_builtin_setvar_helper(target.chan1, "BRIDGE_PLAY_SOUND", chan1_attended_sound); @@ -17456,8 +17465,10 @@ if (!ast_strlen_zero(chan2_attended_sound)) { pbx_builtin_setvar_helper(target.chan2, "BRIDGE_PLAY_SOUND", chan2_attended_sound); } + ast_channel_lock(target.chan1); + ast_channel_lock(target.chan2); } - + /* Perform the transfer */ manager_event(EVENT_FLAG_CALL, "Transfer", "TransferMethod: SIP\r\nTransferType: Attended\r\nChannel: %s\r\nUniqueid: %s\r\nSIP-Callid: %s\r\nTargetChannel: %s\r\nTargetUniqueid: %s\r\n", transferer->owner->name,