efi_loader: cursor positioning
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 4 Sep 2019 19:13:45 +0000 (21:13 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 5 Sep 2019 21:18:51 +0000 (23:18 +0200)
When backspacing in column 0 do no set the column index to ULONG_MAX.
Ensure that the row number is not set to ULONG_MAX even if the row count is
advertised as 0.
Ignore control characters other the 0x08, 0x0a, 0x0d when updating the
column.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_console.c

index d4765afb98498600b9d97cd2c4a3454046eb057d..5560fc8deaa05a85ab439c6f2c4b9087b29ecd32 100644 (file)
@@ -156,13 +156,14 @@ static efi_status_t EFIAPI efi_cout_output_string(
         * Update the cursor position.
         *
         * The UEFI spec provides advance rules for U+0000, U+0008, U+000A,
-        * and U000D. All other characters, including control characters
-        * U+0007 (BEL) and U+0009 (TAB), have to increase the column by one.
+        * and U000D. All other control characters are ignored. Any non-control
+        * character increase the column by one.
         */
        for (p = string; *p; ++p) {
                switch (*p) {
                case '\b':      /* U+0008, backspace */
-                       con->cursor_column = max(0, con->cursor_column - 1);
+                       if (con->cursor_column)
+                               con->cursor_column--;
                        break;
                case '\n':      /* U+000A, newline */
                        con->cursor_column = 0;
@@ -178,14 +179,21 @@ static efi_status_t EFIAPI efi_cout_output_string(
                         */
                        break;
                default:
-                       con->cursor_column++;
+                       /* Exclude control codes */
+                       if (*p > 0x1f)
+                               con->cursor_column++;
                        break;
                }
                if (con->cursor_column >= mode->columns) {
                        con->cursor_column = 0;
                        con->cursor_row++;
                }
-               con->cursor_row = min(con->cursor_row, (s32)mode->rows - 1);
+               /*
+                * When we exceed the row count the terminal will scroll up one
+                * line. We have to adjust the cursor position.
+                */
+               if (con->cursor_row >= mode->rows && con->cursor_row)
+                       con->cursor_row--;
        }
 
 out: