summaryrefslogtreecommitdiff
path: root/src/boot/efi
diff options
context:
space:
mode:
authorPaul Cercueil <paul@crapouillou.net>2020-06-14 12:51:36 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-06-15 08:05:57 +0200
commit6fe95d302086e8a89b1bc6d443e0e2c3e0b0f136 (patch)
tree5027afd3da13f66e9848aaeaa926948323b4f315 /src/boot/efi
parent7daaf56761bd7fe4874215560db8184808541581 (diff)
downloadsystemd-6fe95d302086e8a89b1bc6d443e0e2c3e0b0f136.tar.gz
sd-boot: Work around malformed CR key code
When a key is pressed, the EFI firmware gives us a 64-bit word that contains the modifier key code in the upper 32 bits, the scan code in the middle 16 bits, and a unicode character in the low 16 bits. Some bogus EFI firmwares will put the unicode character in the scan code area, for instance on the EZpad mini 4s tablet. Others will even put the unicode character in both the scan code and unicode areas. This is the case for instance on the Teclast X98+ II tablet. Add workarounds for these corner cases, only for the carriage return key right now. Some more workarounds may be needed, e.g. for volume keys, but I cannot test it. Partially fixes #8466. Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Diffstat (limited to 'src/boot/efi')
-rw-r--r--src/boot/efi/boot.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index 1fe2a2bdc3..952c3f62c2 100644
--- a/src/boot/efi/boot.c
+++ b/src/boot/efi/boot.c
@@ -272,6 +272,8 @@ static BOOLEAN line_edit(
case KEYPRESS(0, 0, CHAR_LINEFEED):
case KEYPRESS(0, 0, CHAR_CARRIAGE_RETURN):
+ case KEYPRESS(0, CHAR_CARRIAGE_RETURN, 0):
+ case KEYPRESS(0, CHAR_CARRIAGE_RETURN, CHAR_CARRIAGE_RETURN):
if (StrCmp(line, line_in) != 0)
*line_out = TAKE_PTR(line);
enter = TRUE;
@@ -742,6 +744,8 @@ static BOOLEAN menu_run(
case KEYPRESS(0, 0, CHAR_LINEFEED):
case KEYPRESS(0, 0, CHAR_CARRIAGE_RETURN):
+ case KEYPRESS(0, CHAR_CARRIAGE_RETURN, 0):
+ case KEYPRESS(0, CHAR_CARRIAGE_RETURN, CHAR_CARRIAGE_RETURN):
case KEYPRESS(0, SCAN_RIGHT, 0):
exit = TRUE;
break;