From mboxrd@z Thu Jan 1 00:00:00 1970 From: matthias.bgg at kernel.org Date: Tue, 5 Mar 2019 12:50:19 +0100 Subject: [U-Boot] [PATCH v2 2/2] efi_loader: Fix possible starving in efi_cin_read_key In-Reply-To: <20190305115019.3581-1-matthias.bgg@kernel.org> References: <20190305115019.3581-1-matthias.bgg@kernel.org> Message-ID: <20190305115019.3581-2-matthias.bgg@kernel.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de From: Matthias Brugger 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 --- 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