:: commit cf7d9e736030160836706a8a1f269eb09b22cfb9

mintsuki <mintsuki@protonmail.com> — 2022-04-22 14:48

parents: cac57ced41

readline: Fix 1 uncaught NULL deref

diff --git a/common/lib/readline.c b/common/lib/readline.c
index 12e6963b..119e1181 100644
--- a/common/lib/readline.c
+++ b/common/lib/readline.c
@@ -263,12 +263,16 @@ int pit_sleep_and_quit_on_keypress(int seconds) {
     EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *exproto = NULL;
     EFI_SIMPLE_TEXT_IN_PROTOCOL *sproto = NULL;
 
+    bool use_sproto = false;
+
     if (gBS->HandleProtocol(gST->ConsoleInHandle, &exproto_guid, (void **)&exproto) != EFI_SUCCESS) {
         if (gBS->HandleProtocol(gST->ConsoleInHandle, &sproto_guid, (void **)&sproto) != EFI_SUCCESS) {
             panic(false, "Your input device doesn't have an input protocol!");
         }
 
         events[0] = sproto->WaitForKey;
+
+        use_sproto = true;
     } else {
         events[0] = exproto->WaitForKeyEx;
     }
@@ -287,7 +291,7 @@ again:
     }
 
     EFI_STATUS status;
-    if (events[0] == sproto->WaitForKey) {
+    if (use_sproto) {
         status = sproto->ReadKeyStroke(sproto, &kd.Key);
     } else {
         status = exproto->ReadKeyStrokeEx(exproto, &kd);
@@ -316,7 +320,7 @@ again:
             return GETCHAR_ESCAPE;
         }
 
-        if (events[0] == sproto->WaitForKey) {
+        if (use_sproto) {
             status = sproto->ReadKeyStroke(sproto, &kd.Key);
         } else {
             status = exproto->ReadKeyStrokeEx(exproto, &kd);
@@ -327,7 +331,7 @@ again:
         }
 
         if (kd.Key.UnicodeChar == '[') {
-            return input_sequence(events[0] == exproto->WaitForKeyEx, exproto, sproto);
+            return input_sequence(!use_sproto, exproto, sproto);
         }
     }
 
tab: 248 wrap: offon