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]
This commit is contained in:
Dragan Dosen 2016-11-24 11:33:12 +01:00 committed by Willy Tarreau
parent 796c5b7997
commit a1c35ab68d
2 changed files with 9 additions and 5 deletions

View File

@ -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

View File

@ -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++;
}