From: Richard Mudgett Date: Thu, 3 Feb 2011 00:02:43 +0000 (+0000) Subject: Minor AST_FRAME_TEXT related issues. X-Git-Tag: 1.4.41-rc1~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9fe4bc60b59d6ac268d559b116af5c868ae5f217;p=thirdparty%2Fasterisk.git 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(). git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@305888 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_sendtext.c b/apps/app_sendtext.c index e64bf03ee5..297630e3e8 100644 --- a/apps/app_sendtext.c +++ b/apps/app_sendtext.c @@ -105,10 +105,10 @@ static int sendtext_exec(struct ast_channel *chan, void *data) return 0; } status = "FAILURE"; - ast_channel_unlock(chan); res = ast_sendtext(chan, args.text); if (!res) status = "SUCCESS"; + ast_channel_unlock(chan); pbx_builtin_setvar_helper(chan, "SENDTEXTSTATUS", status); ast_module_user_remove(u); return 0; diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a38297ca29..87d6f34dfe 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11044,7 +11044,7 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req) f.subclass = 0; f.offset = 0; f.data = 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 */ } else { /* Message outside of a call, we do not support that */ diff --git a/main/channel.c b/main/channel.c index 8ac513d465..41753fb8fb 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2905,13 +2905,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; }