aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-26 16:54:17 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-26 16:54:17 +0000
commit4d54055e4a51496224e6fca31cac17aea8d0c110 (patch)
tree9e4fd0a0fd6d101ed8e59016416e866121d8649a /channels/chan_iax2.c
parentc5feef74a7345e78e26b360cf192e450126cfc7d (diff)
Merged revisions 56785 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r56785 | russell | 2007-02-26 10:51:18 -0600 (Mon, 26 Feb 2007) | 3 lines 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: http://svn.digium.com/svn/asterisk/trunk@56786 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r--channels/chan_iax2.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index dd1d4bfd2..6846be92f 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -3323,23 +3323,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)