BUG/MINOR: cli: cli_snd_buf: preserve \r\n for payload lines
authorValentine Krasnobaeva <vkrasnobaeva@haproxy.com>
Thu, 12 Dec 2024 18:38:38 +0000 (19:38 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 9 Jan 2025 09:28:03 +0000 (10:28 +0100)
cli_snd_buf() analyzez input line by line. Before this patch it has always
scanned a given line for the presence of '\r' followed by '\n'.

This is only needed for strings, that contain the commands itself like
"show ssl cert\n", "set ssl cert test.pem <<\n".

In case of strings, which contain the command's payload, like
"-----BEGIN CERTIFICATE-----\r\n", '\r\n' should be preserved
as is.

This patch fixes the GitHub issue #2818.

This patch should be backported in v3.1 and in v3.0.

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

src/cli.c

index a718f3f..c036808 100644 (file)
--- a/src/cli.c
+++ b/src/cli.c
@@ -958,19 +958,19 @@ size_t cli_snd_buf(struct appctx *appctx, struct buffer *buf, size_t count, unsi
 
                if (str[len-1] == '\n')
                        lf = 1;
-
-               /* Remove the trailing \r, if any and add a null byte at the
-                * end. For normal mode, the trailing \n is removed, but we
-                * conserve if for payload mode.
-                */
                len--;
-               if (len && str[len-1] == '\r')
-                       len--;
+
                if (appctx->st1 & APPCTX_CLI_ST1_PAYLOAD) {
                        str[len+1] = '\0';
                        b_add(&appctx->inbuf, len+1);
                }
                else  {
+                       /* Remove the trailing \r, if any and add a null byte at the
+                        * end. For normal mode, the trailing \n is removed, but we
+                        * conserve \r\n or \n sequences for payload mode.
+                        */
+                       if (len && str[len-1] == '\r')
+                               len--;
                        str[len] = '\0';
                        b_add(&appctx->inbuf, len);
                }