]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 305889 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Thu, 3 Feb 2011 00:24:40 +0000 (00:24 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 3 Feb 2011 00:24:40 +0000 (00:24 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.8@305923 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_sendtext.c
channels/chan_sip.c
main/channel.c
main/manager.c

index 99dbeea7e6118593c795e3ebed9f0649cb11c4a7..2624fe505b4e05c72bab48deec5af09b147d6e33 100644 (file)
@@ -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;
 }
index 68347e525bad51c558a4be3ef7fca1317f4956d8..b7c2270e4efee6eb44faf25d14afa1f1889b1f3c 100644 (file)
@@ -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;
index 65ef91b674cfb29b52be65fb42ec8b22c5365c48..9080d8b36a5c039cd47e98619b821ed54719fdf3 100644 (file)
@@ -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;
 }
 
index a64e802ca15cb02c57c13244cb9595a408150d73..0a91c34bab5885efb03e7badd1e074b90650dde0 100644 (file)
@@ -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");