commands/read: Fix overflow in grub_getline()

Store returned value from grub_getkey() in int instead of char to
prevent throwing away the extended bits. This was a problem because,
for instance, the left arrow key press would return
(GRUB_TERM_EXTENDED | 0x4b), which would have the GRUB_TERM_EXTENDED
thrown away leaving 0x4b or 'K'. These extended keys should either
work as intended or do nothing. This change has them do nothing,
instead of inserting a key not pressed by the user.

Signed-off-by: Li Gen <ligenlive@gmail.com>
Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Li Gen authored and Daniel Kiper committed 2022-10-04 15:38:39 +02:00
1 parent 4740430bd2
commit 0865019b08
1 file changed
+6 -3
+6 -3
View File
@@ -40,7 +40,7 @@ grub_getline (int silent)
int i;
char *line;
char *tmp;
char c;
int c;
i = 0;
line = grub_malloc (1 + i + sizeof('\0'));
@@ -53,8 +53,11 @@ grub_getline (int silent)
if ((c == '\n') || (c == '\r'))
break;
line[i] = c;
if (!silent && grub_isprint (c))
if (!grub_isprint (c))
continue;
line[i] = (char) c;
if (!silent)
grub_printf ("%c", c);
i++;
tmp = grub_realloc (line, 1 + i + sizeof('\0'));