]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
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)
committerWilliam Lallemand <wlallemand@haproxy.org>
Fri, 19 Jun 2020 12:32:55 +0000 (14:32 +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.

src/cli.c

index 5912e21b0286e6d75f2538c9844466b04bfafdcd..36438c7ca8f3834afa7bb2194a57802ad72e3e59 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -2074,29 +2074,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++;
        }