[asterisk-commits] russell: branch 1.4 r56785 -
/branches/1.4/channels/chan_iax2.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Mon Feb 26 09:51:18 MST 2007
Author: russell
Date: Mon Feb 26 10:51:18 2007
New Revision: 56785
URL: http://svn.digium.com/view/asterisk?view=rev&rev=56785
Log:
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)
Modified:
branches/1.4/channels/chan_iax2.c
Modified: branches/1.4/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_iax2.c?view=diff&rev=56785&r1=56784&r2=56785
==============================================================================
--- branches/1.4/channels/chan_iax2.c (original)
+++ branches/1.4/channels/chan_iax2.c Mon Feb 26 10:51:18 2007
@@ -3184,23 +3184,34 @@
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)
More information about the asterisk-commits
mailing list