<p>N A has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/18004">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cli: Fix infinite loop on terminating backslash<br><br>A corner case exists in CLI parsing where if<br>a CLI user in a remote console ends with<br>a backslash and then invokes command completion<br>(using TAB or ?), then the console will freeze<br>forever until a SIGQUIT signal is sent to the<br>process, due to getting stuck in an infinite<br>loop reading the command completion. CTRL+C<br>and other key combinations have no impact on<br>the CLI session.<br><br>This changes the remote console behavior to<br>match foreground console behavior by discarding<br>trailing backslashes in commands before doing<br>command completion, since the backslash is not<br>being used for escaping as they are intended for.<br><br>ASTERISK-29822 #close<br><br>Change-Id: I9810ac59304fec162da701653c9c834f0ec8f670<br>---<br>M main/asterisk.c<br>1 file changed, 16 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/04/18004/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/main/asterisk.c b/main/asterisk.c</span><br><span>index 4520318..d0ac702 100644</span><br><span>--- a/main/asterisk.c</span><br><span>+++ b/main/asterisk.c</span><br><span>@@ -2925,6 +2925,22 @@</span><br><span>         savechr = *(char *)lf->cursor;</span><br><span>    *(char *)lf->cursor = '\0';</span><br><span>       ptr = (char *)lf->cursor;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ast_opt_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /*</span><br><span style="color: hsl(120, 100%, 40%);">+            * This fixes the bug where if the last char typed in</span><br><span style="color: hsl(120, 100%, 40%);">+          * the CLI before pressing TAB or ? is a backslash,</span><br><span style="color: hsl(120, 100%, 40%);">+            * then we get stuck in an infinite loop on the call</span><br><span style="color: hsl(120, 100%, 40%);">+           * to read in this function. This only affects remote</span><br><span style="color: hsl(120, 100%, 40%);">+          * console, so if we encounter a terminating backslash,</span><br><span style="color: hsl(120, 100%, 40%);">+                * get rid of it for the command completion, so the</span><br><span style="color: hsl(120, 100%, 40%);">+            * behavior is the same as foreground console. */</span><br><span style="color: hsl(120, 100%, 40%);">+              char *c = (char*) lf->buffer + strlen(lf->buffer) - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (*c == '\\') {</span><br><span style="color: hsl(120, 100%, 40%);">+                     *c = '\0';</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>  if (ptr) {</span><br><span>           while (ptr > lf->buffer) {</span><br><span>                     if (isspace(*ptr)) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/18004">change 18004</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/+/18004"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I9810ac59304fec162da701653c9c834f0ec8f670 </div>
<div style="display:none"> Gerrit-Change-Number: 18004 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>