BUG/MINOR: mworker/cli: fix the escaping in the master CLI
authorWilliam Lallemand <wlallemand@haproxy.com>
Thu, 18 Jun 2020 16:03:57 +0000 (18:03 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 3 Jul 2020 17:03:54 +0000 (19:03 +0200)
The master CLI must not do the escaping since it forwards the commands
to another CLI. It should be able to split into words by taking care of
the escaping, but must not remove the forwarded backslashes.

This fix do the same thing as the previous patch applied to the
cli_parse_request() function, by taking care of the escaping during the
word split, but it also remove the part which was removing the
backslashes from the forwarded command.

(cherry picked from commit fe249c3df53127d53d55c3fda8e6be7f22cfa58b)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/cli.c

index 7b232a2..3b89e93 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -2110,29 +2110,25 @@ int pcli_parse_request(struct stream *s, struct channel *req, char **errmsg, int
 
        /* splits the command in words */
        while (i < MAX_STATS_ARGS && p < end) {
-               int j, k;
-
                /* skip leading spaces/tabs */
                p += strspn(p, " \t");
                if (!*p)
                        break;
 
                args[i] = p;
-               p += strcspn(p, " \t");
-               *p++ = 0;
-
-               /* unescape backslashes (\) */
-               for (j = 0, k = 0; args[i][k]; k++) {
-                       if (args[i][k] == '\\') {
-                               if (args[i][k + 1] == '\\')
-                                       k++;
-                               else
-                                       continue;
+               while (1) {
+                       p += strcspn(p, " \t\\");
+                       /* escaped chars using backlashes (\) */
+                       if (*p == '\\') {
+                               if (!*++p)
+                                       break;
+                               if (!*++p)
+                                       break;
+                       } else {
+                               break;
                        }
-                       args[i][j] = args[i][k];
-                       j++;
                }
-               args[i][j] = 0;
+               *p++ = 0;
                i++;
        }