[U-Boot] [PATCH v2 2/2] efi_loader: Fix possible starving in efi_cin_read_key
matthias.bgg at kernel.org
matthias.bgg at kernel.org
Tue Mar 5 11:50:19 UTC 2019
From: Matthias Brugger <mbrugger at 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 <mbrugger at 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
More information about the U-Boot
mailing list