aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2011-02-03 00:24:40 +0000
committerrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2011-02-03 00:24:40 +0000
commite2bec54f87ffa77aa774eba59a87945932a5801b (patch)
treed75acbeec29c592e10652a6e58ac49b015f0ef07
parentb8a4da79ce5a4fbb42fd088d2874ec95b0717f86 (diff)
Merged revisions 305889 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r305889 | rmudgett | 2011-02-02 18:15:07 -0600 (Wed, 02 Feb 2011) | 17 lines Merged revisions 305888 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r305888 | rmudgett | 2011-02-02 18:02:43 -0600 (Wed, 02 Feb 2011) | 8 lines Minor AST_FRAME_TEXT related issues. * Include the null terminator in the buffer length. When the frame is queued it is copied. If the null terminator is not part of the frame buffer length, the receiver could see garbage appended onto it. * Add channel lock protection with ast_sendtext(). * Fixed AMI SendText action ast_sendtext() return value check. ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@305923 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_sendtext.c2
-rw-r--r--channels/chan_sip.c2
-rw-r--r--main/channel.c7
-rw-r--r--main/manager.c4
4 files changed, 9 insertions, 6 deletions
diff --git a/apps/app_sendtext.c b/apps/app_sendtext.c
index 99dbeea7e..2624fe505 100644
--- a/apps/app_sendtext.c
+++ b/apps/app_sendtext.c
@@ -98,10 +98,10 @@ static int sendtext_exec(struct ast_channel *chan, const char *data)
return 0;
}
status = "FAILURE";
- ast_channel_unlock(chan);
if (!ast_sendtext(chan, ast_str_buffer(str))) {
status = "SUCCESS";
}
+ ast_channel_unlock(chan);
pbx_builtin_setvar_helper(chan, "SENDTEXTSTATUS", status);
return 0;
}
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 68347e525..b7c2270e4 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -15333,7 +15333,7 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req)
f.subclass.integer = 0;
f.offset = 0;
f.data.ptr = buf;
- f.datalen = strlen(buf);
+ f.datalen = strlen(buf) + 1;
ast_queue_frame(p->owner, &f);
transmit_response(p, "202 Accepted", req); /* We respond 202 accepted, since we relay the message */
return;
diff --git a/main/channel.c b/main/channel.c
index 65ef91b67..9080d8b36 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -4465,13 +4465,18 @@ char *ast_recvtext(struct ast_channel *chan, int timeout)
int ast_sendtext(struct ast_channel *chan, const char *text)
{
int res = 0;
+
+ ast_channel_lock(chan);
/* Stop if we're a zombie or need a soft hangup */
- if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
+ if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
+ ast_channel_unlock(chan);
return -1;
+ }
CHECK_BLOCKING(chan);
if (chan->tech->send_text)
res = chan->tech->send_text(chan, text);
ast_clear_flag(chan, AST_FLAG_BLOCKING);
+ ast_channel_unlock(chan);
return res;
}
diff --git a/main/manager.c b/main/manager.c
index a64e802ca..0a91c34ba 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -3251,12 +3251,10 @@ static int action_sendtext(struct mansession *s, const struct message *m)
return 0;
}
- ast_channel_lock(c);
res = ast_sendtext(c, textmsg);
- ast_channel_unlock(c);
c = ast_channel_unref(c);
- if (res > 0) {
+ if (res >= 0) {
astman_send_ack(s, m, "Success");
} else {
astman_send_error(s, m, "Failure");