<p>Friendly Automation <strong>submitted</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/14773">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Joshua Colp: Looks good to me, but someone else must approve
  George Joseph: Looks good to me, approved
  Friendly Automation: Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bridge_channel: Ensure text messages are zero terminated<br><br>T.140 data in RTP is not zero terminated, so when we are queuing a text<br>frame on a bridge we need to ensure that we are passing a zero<br>terminated string.<br><br>ASTERISK-28974 #close<br><br>Change-Id: Ic10057387ce30b2094613ea67e3ae8c5c431dda3<br>---<br>M include/asterisk/frame.h<br>M main/bridge_channel.c<br>2 files changed, 40 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h</span><br><span>index 8892765..c5267b1 100644</span><br><span>--- a/include/asterisk/frame.h</span><br><span>+++ b/include/asterisk/frame.h</span><br><span>@@ -107,7 +107,10 @@</span><br><span>   AST_FRAME_NULL,</span><br><span>      /*! Inter Asterisk Exchange private frame type */</span><br><span>    AST_FRAME_IAX,</span><br><span style="color: hsl(0, 100%, 40%);">-  /*! Text messages */</span><br><span style="color: hsl(120, 100%, 40%);">+  /*! Text messages. The character data may not be zero-terminated, so</span><br><span style="color: hsl(120, 100%, 40%);">+   * care should be taken when passing it to functions that expect a</span><br><span style="color: hsl(120, 100%, 40%);">+     * zero-terminated string. The frame's datalen member should be used</span><br><span style="color: hsl(120, 100%, 40%);">+       * as it indicates the actual number of bytes available. */</span><br><span>  AST_FRAME_TEXT,</span><br><span>      /*! Image Frames */</span><br><span>  AST_FRAME_IMAGE,</span><br><span>diff --git a/main/bridge_channel.c b/main/bridge_channel.c</span><br><span>index 251dea7..ade98fd 100644</span><br><span>--- a/main/bridge_channel.c</span><br><span>+++ b/main/bridge_channel.c</span><br><span>@@ -2377,6 +2377,41 @@</span><br><span> </span><br><span> /*!</span><br><span>  * \internal</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Ensure text data is zero terminated before sending</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param chan Channel to send text to</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param f The frame containing the text data to send</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return Nothing</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void sendtext_safe(struct ast_channel *chan, const struct ast_frame *f)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (f->datalen) {</span><br><span style="color: hsl(120, 100%, 40%);">+          char *text = f->data.ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (text[f->datalen - 1]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* Not zero terminated, we need to allocate */</span><br><span style="color: hsl(120, 100%, 40%);">+                        text = ast_strndup(text, f->datalen);</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (!text) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_sendtext(chan, text);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (text != f->data.ptr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Only free if we allocated */</span><br><span style="color: hsl(120, 100%, 40%);">+                       ast_free(text);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Special case if the frame length is zero (although I</span><br><span style="color: hsl(120, 100%, 40%);">+                * am not sure this is possible?) */</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_sendtext(chan, "");</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \internal</span><br><span>  * \brief Handle bridge channel write frame to channel.</span><br><span>  * \since 12.0.0</span><br><span>  *</span><br><span>@@ -2449,7 +2484,7 @@</span><br><span>       case AST_FRAME_TEXT:</span><br><span>                 ast_debug(1, "Sending TEXT frame to '%s': %*.s\n",</span><br><span>                         ast_channel_name(bridge_channel->chan), fr->datalen, (char *)fr->data.ptr);</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_sendtext(bridge_channel->chan, fr->data.ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+               sendtext_safe(bridge_channel->chan, fr);</span><br><span>          break;</span><br><span>       case AST_FRAME_TEXT_DATA:</span><br><span>            msg = (struct ast_msg_data *)fr->data.ptr;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/14773">change 14773</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/14773"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 17 </div>
<div style="display:none"> Gerrit-Change-Id: Ic10057387ce30b2094613ea67e3ae8c5c431dda3 </div>
<div style="display:none"> Gerrit-Change-Number: 14773 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Sean Bright <sean.bright@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@sangoma.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>