From: Matthias Brugger <mbrug...@suse.com>

The function efi_cin_read_key can be affected by a loss of
a character which will make u-boot to wait forever.
Fix this by calling term_get_char instead.

Signed-off-by: Matthias Brugger <mbrug...@suse.com>
---

Changes in v2: None

 lib/efi_loader/efi_console.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c
index 1133674faf..558aaed109 100644
--- a/lib/efi_loader/efi_console.c
+++ b/lib/efi_loader/efi_console.c
@@ -493,13 +493,14 @@ static int analyze_modifiers(struct efi_key_state 
*key_state)
 {
        int c, mod = 0, ret = 0;
 
-       c = getc();
+       if (!term_get_char(&c))
+               goto out;
 
        if (c != ';') {
                ret = c;
                if (c == '~')
                        goto out;
-               c = getc();
+               term_get_char(&c);
        }
        for (;;) {
                switch (c) {
@@ -508,7 +509,7 @@ static int analyze_modifiers(struct efi_key_state 
*key_state)
                        mod += c - '0';
                /* fall through */
                case ';':
-                       c = getc();
+                       term_get_char(&c);
                        break;
                default:
                        goto out;
@@ -551,7 +552,9 @@ static efi_status_t efi_cin_read_key(struct efi_key_data 
*key)
                 * Xterm Control Sequences
                 * https://www.xfree86.org/4.8.0/ctlseqs.html
                 */
-               ch = getc();
+               if (!term_get_char(&ch))
+                       return EFI_NOT_READY;
+
                switch (ch) {
                case cESC: /* ESC */
                        pressed_key.scan_code = 23;
@@ -561,12 +564,15 @@ static efi_status_t efi_cin_read_key(struct efi_key_data 
*key)
                        /* consider modifiers */
                        if (ch < 'P') {
                                set_shift_mask(ch - '0', &key->key_state);
-                               ch = getc();
+                               if (!term_get_char(&ch))
+                                       return EFI_NOT_READY;
                        }
                        pressed_key.scan_code = ch - 'P' + 11;
                        break;
                case '[':
-                       ch = getc();
+                       if (!term_get_char(&ch))
+                               return EFI_NOT_READY;
+
                        switch (ch) {
                        case 'A'...'D': /* up, down right, left */
                                pressed_key.scan_code = ch - 'A' + 1;
-- 
2.20.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to