Some consoles use CSI 200~ and CSI 201~ to bracket inserts. This leads
U-Boot to misinterpret the inserted string. Ignore these escape sequences.

Signed-off-by: Heinrich Schuchardt <[email protected]>
---
 common/cli_readline.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/common/cli_readline.c b/common/cli_readline.c
index c7614a4c90..e86ee73faf 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -321,6 +321,7 @@ static int cread_line(const char *const prompt, char *buf, 
unsigned int *len,
                                        act = ESC_CONVERTED;
                                        break;  /* pass off to ^N handler */
                                case '1':
+                               case '2':
                                case '3':
                                case '4':
                                case '7':
@@ -332,7 +333,8 @@ static int cread_line(const char *const prompt, char *buf, 
unsigned int *len,
                                        break;
                                }
                        } else if (esc_len == 3) {
-                               if (ichar == '~') {
+                               switch (ichar) {
+                               case '~':
                                        switch (esc_save[2]) {
                                        case '3':       /* Delete key */
                                                ichar = CTL_CH('d');
@@ -349,9 +351,25 @@ static int cread_line(const char *const prompt, char *buf, 
unsigned int *len,
                                                act = ESC_CONVERTED;
                                                break;  /* pass to ^E handler */
                                        }
+                                       break;
+                               case '0':
+                                       if (esc_save[2] == '2')
+                                               act = ESC_SAVE;
+                                       break;
+                               }
+                       } else if (esc_len == 4) {
+                               switch (ichar) {
+                               case '0':
+                               case '1':
+                                       act = ESC_SAVE;
+                                       break;          /* bracketed paste */
+                               }
+                       } else if (esc_len == 5) {
+                               if (ichar == '~') {     /* bracketed paste */
+                                       ichar = 0;
+                                       act = ESC_CONVERTED;
                                }
                        }
-
                        switch (act) {
                        case ESC_SAVE:
                                esc_save[esc_len++] = ichar;
-- 
2.34.1

Reply via email to