Accepting request 209582 from home:gary_lin:branches:devel:openSUSE:Factory
handle the error status from ReadKeyStroke to avoid unexpected keys OBS-URL: https://build.opensuse.org/request/show/209582 OBS-URL: https://build.opensuse.org/package/show/devel:openSUSE:Factory/shim?expand=0&rev=53
This commit is contained in:
parent
1640d5b323
commit
1e4680c8fe
157
shim-mokmanager-handle-keystroke-error.patch
Normal file
157
shim-mokmanager-handle-keystroke-error.patch
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
From 7edfcaa6e03c8aa1ce39e8eb193d2064f4119342 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gary Ching-Pang Lin <glin@suse.com>
|
||||||
|
Date: Tue, 3 Dec 2013 15:52:02 +0800
|
||||||
|
Subject: [PATCH] MokManager: handle the error status from ReadKeyStroke
|
||||||
|
|
||||||
|
On some machines, even though the key event was signaled, ReadKeyStroke
|
||||||
|
still got EFI_NOT_READY. This commit handles the error status to avoid
|
||||||
|
console_get_keystroke from returning unexpected keys.
|
||||||
|
|
||||||
|
Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
|
||||||
|
---
|
||||||
|
MokManager.c | 17 +++++++++++++----
|
||||||
|
include/console.h | 4 ++--
|
||||||
|
lib/console.c | 26 ++++++++++++++++++--------
|
||||||
|
3 files changed, 33 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/MokManager.c b/MokManager.c
|
||||||
|
index f5ed379..d700fa8 100644
|
||||||
|
--- a/MokManager.c
|
||||||
|
+++ b/MokManager.c
|
||||||
|
@@ -488,13 +488,19 @@ static EFI_STATUS list_keys (void *KeyList, UINTN KeyListSize, CHAR16 *title)
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static UINT8 get_line (UINT32 *length, CHAR16 *line, UINT32 line_max, UINT8 show)
|
||||||
|
+static EFI_STATUS get_line (UINT32 *length, CHAR16 *line, UINT32 line_max, UINT8 show)
|
||||||
|
{
|
||||||
|
EFI_INPUT_KEY key;
|
||||||
|
+ EFI_STATUS status;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
- key = console_get_keystroke();
|
||||||
|
+ status = console_get_keystroke(&key);
|
||||||
|
+ if (EFI_ERROR (status)) {
|
||||||
|
+ console_error(L"Failed to read the keystroke", status);
|
||||||
|
+ *length = 0;
|
||||||
|
+ return status;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if ((count >= line_max &&
|
||||||
|
key.UnicodeChar != CHAR_BACKSPACE) ||
|
||||||
|
@@ -525,7 +531,7 @@ static UINT8 get_line (UINT32 *length, CHAR16 *line, UINT32 line_max, UINT8 show
|
||||||
|
|
||||||
|
*length = count;
|
||||||
|
|
||||||
|
- return 1;
|
||||||
|
+ return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static EFI_STATUS compute_pw_hash (void *Data, UINTN DataSize, UINT8 *password,
|
||||||
|
@@ -989,6 +995,7 @@ static INTN mok_deletion_prompt (void *MokDel, UINTN MokDelSize)
|
||||||
|
static CHAR16 get_password_charater (CHAR16 *prompt)
|
||||||
|
{
|
||||||
|
SIMPLE_TEXT_OUTPUT_MODE SavedMode;
|
||||||
|
+ EFI_STATUS status;
|
||||||
|
CHAR16 *message[2];
|
||||||
|
CHAR16 character;
|
||||||
|
UINTN length;
|
||||||
|
@@ -1003,7 +1010,9 @@ static CHAR16 get_password_charater (CHAR16 *prompt)
|
||||||
|
message[1] = NULL;
|
||||||
|
length = StrLen(message[0]);
|
||||||
|
console_print_box_at(message, -1, -length-4, -5, length+4, 3, 0, 1);
|
||||||
|
- get_line(&pw_length, &character, 1, 0);
|
||||||
|
+ status = get_line(&pw_length, &character, 1, 0);
|
||||||
|
+ if (EFI_ERROR(status))
|
||||||
|
+ character = 0;
|
||||||
|
|
||||||
|
console_restore_mode(&SavedMode);
|
||||||
|
|
||||||
|
diff --git a/include/console.h b/include/console.h
|
||||||
|
index e6c2818..9c793ea 100644
|
||||||
|
--- a/include/console.h
|
||||||
|
+++ b/include/console.h
|
||||||
|
@@ -1,8 +1,8 @@
|
||||||
|
#ifndef _SHIM_LIB_CONSOLE_H
|
||||||
|
#define _SHIM_LIB_CONSOLE_H 1
|
||||||
|
|
||||||
|
-EFI_INPUT_KEY
|
||||||
|
-console_get_keystroke(void);
|
||||||
|
+EFI_STATUS
|
||||||
|
+console_get_keystroke(EFI_INPUT_KEY *key);
|
||||||
|
void
|
||||||
|
console_print_box_at(CHAR16 *str_arr[], int highlight, int start_col, int start_row, int size_cols, int size_rows, int offset, int lines);
|
||||||
|
void
|
||||||
|
diff --git a/lib/console.c b/lib/console.c
|
||||||
|
index 2fc8db3..41ed83a 100644
|
||||||
|
--- a/lib/console.c
|
||||||
|
+++ b/lib/console.c
|
||||||
|
@@ -40,16 +40,18 @@ SetMem16(CHAR16 *dst, UINT32 n, CHAR16 c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-EFI_INPUT_KEY
|
||||||
|
-console_get_keystroke(void)
|
||||||
|
+EFI_STATUS
|
||||||
|
+console_get_keystroke(EFI_INPUT_KEY *key)
|
||||||
|
{
|
||||||
|
- EFI_INPUT_KEY key;
|
||||||
|
UINTN EventIndex;
|
||||||
|
+ EFI_STATUS status;
|
||||||
|
|
||||||
|
- uefi_call_wrapper(BS->WaitForEvent, 3, 1, &ST->ConIn->WaitForKey, &EventIndex);
|
||||||
|
- uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
|
||||||
|
+ do {
|
||||||
|
+ uefi_call_wrapper(BS->WaitForEvent, 3, 1, &ST->ConIn->WaitForKey, &EventIndex);
|
||||||
|
+ status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, key);
|
||||||
|
+ } while (status == EFI_NOT_READY);
|
||||||
|
|
||||||
|
- return key;
|
||||||
|
+ return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -162,6 +164,8 @@ console_print_box(CHAR16 *str_arr[], int highlight)
|
||||||
|
{
|
||||||
|
SIMPLE_TEXT_OUTPUT_MODE SavedConsoleMode;
|
||||||
|
SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut;
|
||||||
|
+ EFI_INPUT_KEY key;
|
||||||
|
+
|
||||||
|
CopyMem(&SavedConsoleMode, co->Mode, sizeof(SavedConsoleMode));
|
||||||
|
uefi_call_wrapper(co->EnableCursor, 2, co, FALSE);
|
||||||
|
uefi_call_wrapper(co->SetAttribute, 2, co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE);
|
||||||
|
@@ -169,7 +173,7 @@ console_print_box(CHAR16 *str_arr[], int highlight)
|
||||||
|
console_print_box_at(str_arr, highlight, 0, 0, -1, -1, 0,
|
||||||
|
count_lines(str_arr));
|
||||||
|
|
||||||
|
- console_get_keystroke();
|
||||||
|
+ console_get_keystroke(&key);
|
||||||
|
|
||||||
|
uefi_call_wrapper(co->EnableCursor, 2, co, SavedConsoleMode.CursorVisible);
|
||||||
|
|
||||||
|
@@ -184,6 +188,7 @@ console_select(CHAR16 *title[], CHAR16* selectors[], int start)
|
||||||
|
SIMPLE_TEXT_OUTPUT_MODE SavedConsoleMode;
|
||||||
|
SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut;
|
||||||
|
EFI_INPUT_KEY k;
|
||||||
|
+ EFI_STATUS status;
|
||||||
|
int selector;
|
||||||
|
int selector_lines = count_lines(selectors);
|
||||||
|
int selector_max_cols = 0;
|
||||||
|
@@ -237,7 +242,12 @@ console_select(CHAR16 *title[], CHAR16* selectors[], int start)
|
||||||
|
size_cols, size_rows, 0, lines);
|
||||||
|
|
||||||
|
do {
|
||||||
|
- k = console_get_keystroke();
|
||||||
|
+ status = console_get_keystroke(&k);
|
||||||
|
+ if (EFI_ERROR (status)) {
|
||||||
|
+ Print(L"Failed to read the keystroke: %r", status);
|
||||||
|
+ selector = -1;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (k.ScanCode == SCAN_ESC) {
|
||||||
|
selector = -1;
|
||||||
|
--
|
||||||
|
1.8.4
|
||||||
|
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Dec 6 06:44:43 UTC 2013 - glin@suse.com
|
||||||
|
|
||||||
|
- Add shim-mokmanager-handle-keystroke-error.patch to handle the
|
||||||
|
error status from ReadKeyStroke to avoid unexpected keys
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Dec 5 02:05:13 UTC 2013 - glin@suse.com
|
Thu Dec 5 02:05:13 UTC 2013 - glin@suse.com
|
||||||
|
|
||||||
|
@ -48,6 +48,8 @@ Patch3: shim-correct-user_insecure-usage.patch
|
|||||||
Patch4: shim-fix-dhcpv4-path-generation.patch
|
Patch4: shim-fix-dhcpv4-path-generation.patch
|
||||||
# PATCH-FIX-UPSTREAM shim-mokx-support.patch glin@suse.com -- Support MOK blacklist
|
# PATCH-FIX-UPSTREAM shim-mokx-support.patch glin@suse.com -- Support MOK blacklist
|
||||||
Patch5: shim-mokx-support.patch
|
Patch5: shim-mokx-support.patch
|
||||||
|
# PATCH-FIX-UPSTREAM shim-mokmanager-handle-keystroke-error.patch glin@suse.com -- Handle the error status from ReadKeyStroke to avoid the unexpected keys
|
||||||
|
Patch6: shim-mokmanager-handle-keystroke-error.patch
|
||||||
BuildRequires: gnu-efi >= 3.0t
|
BuildRequires: gnu-efi >= 3.0t
|
||||||
BuildRequires: mozilla-nss-tools
|
BuildRequires: mozilla-nss-tools
|
||||||
BuildRequires: openssl >= 0.9.8
|
BuildRequires: openssl >= 0.9.8
|
||||||
@ -75,6 +77,7 @@ Authors:
|
|||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
%patch4 -p1
|
%patch4 -p1
|
||||||
%patch5 -p1
|
%patch5 -p1
|
||||||
|
%patch6 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# first, build MokManager and fallback as they don't depend on a
|
# first, build MokManager and fallback as they don't depend on a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user