]> git.baikalelectronics.ru Git - uboot.git/commitdiff
cli: Correct handling of invalid escape sequences in cread_line()
authorSimon Glass <sjg@chromium.org>
Mon, 27 Mar 2023 19:34:14 +0000 (08:34 +1300)
committerTom Rini <trini@konsulko.com>
Tue, 28 Mar 2023 13:25:51 +0000 (09:25 -0400)
The second call to cli_ch_process() is in the wrong place, meaning that
the one of the characters of an invalid escape sequence is swallowed
instead of being returned.

Fix the bug and add a test to cover this.

This behaviour matches that of the code before cli_getch() was
introduced. This was verified on the commit before c27dce8c77 i.e.:

   06a892504cb ("sandbox: Enable mmc command and legacy images")

Signed-off-by: Simon Glass <sjg@chromium.org>
Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
common/cli_readline.c
include/cli.h
test/common/cread.c

index 709e9c3d38b1487dba4e9fd7c9873e4d0203a193..e83743e90c924fe418a1b5c477c3253c3bf2e405 100644 (file)
@@ -284,10 +284,9 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
                        }
 
                        ichar = getcmd_getch();
+                       ichar = cli_ch_process(cch, ichar);
                }
 
-               ichar = cli_ch_process(cch, ichar);
-
                /* ichar=0x0 when error occurs in U-Boot getc */
                if (!ichar)
                        continue;
index c777c90313f243a2fd86ce0d0479e2e99b6eebd2..094a6602d70eb7e09f3c873685dd7443e3174e7b 100644 (file)
@@ -98,8 +98,8 @@ int cli_readline(const char *const prompt);
  *
  * @prompt:    Prompt to display
  * @buffer:    Place to put the line that is entered
- * @timeout:   Timeout in milliseconds, 0 if none
- * Return: command line length excluding terminator, or -ve on error: of the
+ * @timeout:   Timeout in seconds, 0 if none
+ * Return: command line length excluding terminator, or -ve on error: if the
  * timeout is exceeded (either CONFIG_BOOT_RETRY_TIME or the timeout
  * parameter), then -2 is returned. If a break is detected (Ctrl-C) then
  * -1 is returned.
index 3dce4bdb0ef3e193d8f8097f43b6a7c0857026a7..2fdd29a265f73dd852fcbf766d5ee331c3707803 100644 (file)
@@ -46,3 +46,48 @@ static int cli_ch_test(struct unit_test_state *uts)
        return 0;
 }
 COMMON_TEST(cli_ch_test, 0);
+
+static int cread_test(struct unit_test_state *uts)
+{
+       int duration;
+       ulong start;
+       char buf[10];
+
+       /*
+        * useful for debugging
+        *
+        * gd->flags &= ~GD_FLG_RECORD;
+        * print_buffer(0, buf, 1, 7, 0);
+        */
+
+       console_record_reset_enable();
+
+       /* simple input */
+       *buf = '\0';
+       ut_asserteq(4, console_in_puts("abc\n"));
+       ut_asserteq(3, cli_readline_into_buffer("-> ", buf, 1));
+       ut_asserteq_str("abc", buf);
+
+       /* try an escape sequence (cursor left after the 'c') */
+       *buf = '\0';
+       ut_asserteq(8, console_in_puts("abc\e[Dx\n"));
+       ut_asserteq(4, cli_readline_into_buffer("-> ", buf, 1));
+       ut_asserteq_str("abxc", buf);
+
+       /* invalid escape sequence */
+       *buf = '\0';
+       ut_asserteq(8, console_in_puts("abc\e[Xx\n"));
+       ut_asserteq(7, cli_readline_into_buffer("-> ", buf, 1));
+       ut_asserteq_str("abc\e[Xx", buf);
+
+       /* check timeout, should be between 1000 and 1050ms */
+       start = get_timer(0);
+       *buf = '\0';
+       ut_asserteq(-2, cli_readline_into_buffer("-> ", buf, 1));
+       duration = get_timer(start) - 1000;
+       ut_assert(duration >= 0);
+       ut_assert(duration < 50);
+
+       return 0;
+}
+COMMON_TEST(cread_test, 0);