From: Russell Bryant Date: Mon, 26 Feb 2007 16:51:18 +0000 (+0000) Subject: Do more complete locking of the chan_iax2_pvt struct in the indicate callback. X-Git-Tag: 1.4.1~30 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=268fc8a9ccd73074b4aacdd7814b1525eb713adc;p=thirdparty%2Fasterisk.git Do more complete locking of the chan_iax2_pvt struct in the indicate callback. (Problem brought up by Ben Smithurst on the asterisk-dev list) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@56785 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index bea3187bef..9f7509ab46 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -3184,23 +3184,34 @@ static int iax2_answer(struct ast_channel *c) static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen) { unsigned short callno = PTR_TO_CALLNO(c->tech_pvt); + struct chan_iax2_pvt *pvt = c->tech_pvt; + int res = 0; if (option_debug && iaxdebug) ast_log(LOG_DEBUG, "Indicating condition %d\n", condition); - if (!strcasecmp(iaxs[callno]->mohinterpret, "passthrough")) - return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1); + ast_mutex_lock(&iaxsl[callno]); + + if (!strcasecmp(pvt->mohinterpret, "passthrough")) { + res = send_command(pvt, AST_FRAME_CONTROL, condition, 0, data, datalen, -1); + ast_mutex_unlock(&iaxsl[callno]); + return res; + } switch (condition) { case AST_CONTROL_HOLD: - ast_moh_start(c, data, iaxs[callno]->mohinterpret); - return 0; + ast_moh_start(c, data, pvt->mohinterpret); + break; case AST_CONTROL_UNHOLD: ast_moh_stop(c); - return 0; + break; default: - return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1); + res = send_command(pvt, AST_FRAME_CONTROL, condition, 0, data, datalen, -1); } + + ast_mutex_unlock(&iaxsl[callno]); + + return res; } static int iax2_transfer(struct ast_channel *c, const char *dest)