]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cli: Consume invalid escape sequences early
authorYurii Monakov <monakov.y@gmail.com>
Tue, 10 Oct 2023 08:16:39 +0000 (11:16 +0300)
committerTom Rini <trini@konsulko.com>
Tue, 24 Oct 2023 20:34:45 +0000 (16:34 -0400)
Unexpected 'Esc' key presses are accumulated internally, even if it is
already clear that the current escape sequence is invalid. This results
in weird behaviour. For example, the next character after 'Esc' key
simply disappears from input and 'Unknown command' is printed
after 'Enter'.

This commit fixes some issues with extra 'Esc' keys entered by user:

1. Sequence <Esc><Esc><Enter> right after autoboot stop gives:
=>
nknown command 'ry 'help'
=>
2. Sequence <Esc><p><r><i><Enter> gives:
=> ri
Unknown command 'ri' - try 'help'
=>
3. Extra 'Esc' key presses break backspace functionality.

Signed-off-by: Yurii Monakov <monakov.y@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/cli_getch.c
test/common/cread.c

index 61d4cb261b81dd4a3f94106febf12d07e41095f6..0ee790877748125007bc77ea14e363bb15d2cb98 100644 (file)
@@ -46,6 +46,8 @@ static int cli_ch_esc(struct cli_ch_state *cch, int ichar,
        case 1:
                if (ichar == '[' || ichar == 'O')
                        act = ESC_SAVE;
+               else
+                       act = ESC_CONVERTED;
                break;
        case 2:
                switch (ichar) {
index 2fdd29a265f73dd852fcbf766d5ee331c3707803..4edc77396043cf60476174971156cf99f41bcad8 100644 (file)
@@ -43,6 +43,12 @@ static int cli_ch_test(struct unit_test_state *uts)
        ut_asserteq('a', cli_ch_process(cch, 'a'));
        ut_asserteq(0, cli_ch_process(cch, 0));
 
+       /* unexpected 'Esc' */
+       ut_asserteq('a', cli_ch_process(cch, 'a'));
+       ut_asserteq(0, cli_ch_process(cch, '\e'));
+       ut_asserteq('b', cli_ch_process(cch, 'b'));
+       ut_asserteq(0, cli_ch_process(cch, 0));
+
        return 0;
 }
 COMMON_TEST(cli_ch_test, 0);
@@ -80,6 +86,12 @@ static int cread_test(struct unit_test_state *uts)
        ut_asserteq(7, cli_readline_into_buffer("-> ", buf, 1));
        ut_asserteq_str("abc\e[Xx", buf);
 
+       /* unexpected 'Esc' */
+       *buf = '\0';
+       ut_asserteq(7, console_in_puts("abc\eXx\n"));
+       ut_asserteq(5, cli_readline_into_buffer("-> ", buf, 1));
+       ut_asserteq_str("abcXx", buf);
+
        /* check timeout, should be between 1000 and 1050ms */
        start = get_timer(0);
        *buf = '\0';