From: Dragan Dosen Date: Thu, 24 Nov 2016 10:33:12 +0000 (+0100) Subject: BUG/MINOR: cli: allow the backslash to be escaped on the CLI X-Git-Tag: v1.8-dev1~309 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a1c35ab68d59f877b54dab7f296d3fdd6edff6e9;p=thirdparty%2Fhaproxy.git BUG/MINOR: cli: allow the backslash to be escaped on the CLI In 1.5-dev20, commit 48bcfda ("MEDIUM: dumpstat: make the CLI parser understand the backslash as an escape char") introduced support for backslash on the CLI, but it strips all backslashes in all arguments instead of only unescaping them, making it impossible to pass a backslash in an argument. This will allow us to use a backslash in a command over the socket, eg. "add acl #0 ABC\\XYZ". [wt: this should be backported to 1.7 and 1.6] --- diff --git a/doc/management.txt b/doc/management.txt index c8ba0e379e..dd886dec7a 100644 --- a/doc/management.txt +++ b/doc/management.txt @@ -1249,8 +1249,8 @@ example : # echo "show info;show stat;show table" | socat /var/run/haproxy stdio -If a command needs to use a semi-colon (eg: in a value), it must be preceeded -by a backslash ('\'). +If a command needs to use a semi-colon or a backslash (eg: in a value), it +must be preceeded by a backslash ('\'). The interactive mode displays a prompt ('>') and waits for commands to be entered on the line, then processes them, and displays the prompt again to wait diff --git a/src/cli.c b/src/cli.c index 239a505ad9..a1923bc4e7 100644 --- a/src/cli.c +++ b/src/cli.c @@ -434,13 +434,17 @@ static int cli_parse_request(struct appctx *appctx, char *line) while (++arg <= MAX_STATS_ARGS) args[arg] = line; - /* remove \ */ + /* unescape '\' */ arg = 0; while (*args[arg] != '\0') { j = 0; for (i=0; args[arg][i] != '\0'; i++) { - if (args[arg][i] == '\\') - continue; + if (args[arg][i] == '\\') { + if (args[arg][i+1] == '\\') + i++; + else + continue; + } args[arg][j] = args[arg][i]; j++; }