diff options
author | Simon Glass <sjg@chromium.org> | 2023-03-28 08:34:13 +1300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2023-03-28 09:25:51 -0400 |
commit | 17b45e684af98c1cf37648ad05a98d500b367c5a (patch) | |
tree | 2453033d5e2077a2541844b4781e4d24623db11a /test/common | |
parent | 41a88ad529b3943b1e465846eb24fe2c29203e35 (diff) | |
download | u-boot-17b45e684af98c1cf37648ad05a98d500b367c5a.tar.gz u-boot-17b45e684af98c1cf37648ad05a98d500b367c5a.tar.bz2 u-boot-17b45e684af98c1cf37648ad05a98d500b367c5a.zip |
cli: Correct several bugs in cli_getch()
This function does not behave as expected when unknown escape sequences
are sent to it:
- it fails to store (and thus echo) the last character of the invalid
sequence
- it fails to set esc_len to 0 when it finishes emitting the invalid
sequence, meaning that the following character will appear to be part
of a new escape sequence
- it processes the first character of the rejected sequence as a valid
character, just starting the sequence all over again
The last two bugs conspire to produce an "impossible condition #876"
message which is the main symptom of this behaviour.
Fix these bugs and add a test to verify the behaviour.
Signed-off-by: Simon Glass <sjg@chromium.org>
Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'test/common')
-rw-r--r-- | test/common/Makefile | 1 | ||||
-rw-r--r-- | test/common/cread.c | 48 |
2 files changed, 49 insertions, 0 deletions
diff --git a/test/common/Makefile b/test/common/Makefile index cc918f64e5..a5ab10f6f6 100644 --- a/test/common/Makefile +++ b/test/common/Makefile @@ -3,3 +3,4 @@ obj-y += cmd_ut_common.o obj-$(CONFIG_AUTOBOOT) += test_autoboot.o obj-$(CONFIG_CYCLIC) += cyclic.o obj-$(CONFIG_EVENT) += event.o +obj-y += cread.o diff --git a/test/common/cread.c b/test/common/cread.c new file mode 100644 index 0000000000..3dce4bdb0e --- /dev/null +++ b/test/common/cread.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2023 Google LLC + */ + +#include <common.h> +#include <cli.h> +#include <test/common.h> +#include <test/test.h> +#include <test/ut.h> + +static int cli_ch_test(struct unit_test_state *uts) +{ + struct cli_ch_state s_cch, *cch = &s_cch; + + cli_ch_init(cch); + + /* should be nothing to return at first */ + ut_asserteq(0, cli_ch_process(cch, 0)); + + /* check normal entry */ + ut_asserteq('a', cli_ch_process(cch, 'a')); + ut_asserteq('b', cli_ch_process(cch, 'b')); + ut_asserteq('c', cli_ch_process(cch, 'c')); + ut_asserteq(0, cli_ch_process(cch, 0)); + + /* send an invalid escape sequence */ + ut_asserteq(0, cli_ch_process(cch, '\e')); + ut_asserteq(0, cli_ch_process(cch, '[')); + + /* + * with the next char it sees that the sequence is invalid, so starts + * emitting it + */ + ut_asserteq('\e', cli_ch_process(cch, 'X')); + + /* now we set 0 bytes to empty the buffer */ + ut_asserteq('[', cli_ch_process(cch, 0)); + ut_asserteq('X', cli_ch_process(cch, 0)); + ut_asserteq(0, cli_ch_process(cch, 0)); + + /* things are normal again */ + ut_asserteq('a', cli_ch_process(cch, 'a')); + ut_asserteq(0, cli_ch_process(cch, 0)); + + return 0; +} +COMMON_TEST(cli_ch_test, 0); |