File ovmf-MdeModulePkg-Fix-malformed-terminal-control-sequence.patch of Package ovmf

From aeea04341cd12d237fe90e7ed9ebd1cfe7764dab Mon Sep 17 00:00:00 2001
From: Jack Little <jack.tay.little@hpe.com>
Date: Mon, 14 Jul 2025 15:42:49 -0500
Subject: [PATCH] MdeModulePkg: Fix malformed terminal control sequences

Commit 9224a2b91764ab17b2c1dbc9fdcb012eaed62da6
adds support for larger terminal dimensions; however, the ANSI control
sequences to manipulate the terminal cursor are not built to accomodate
terminal dimensions that are three digits long.

For example, suppose we want to move the cursor 163 columns to the
right. The required control sequence would be `^[[163C`; however, the
existing code will create a control sequence of `^[[@3C` due to trying
to add 16 to the character '0' instead of either 1 or 6.

This fix adds a third digit to the sequence templates for moving the
cursor forward, moving it backwards, and setting the cursor position.

Signed-off-by: Jack Little <jack.tay.little@hpe.com>
---
 .../Universal/Console/TerminalDxe/Terminal.h  |  2 +-
 .../Console/TerminalDxe/TerminalConOut.c      | 32 +++++++++++--------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
index f9ef3b9c09..7a7aa5bb46 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
@@ -163,7 +163,7 @@ typedef union {
 #define FOREGROUND_CONTROL_OFFSET  6
 #define BACKGROUND_CONTROL_OFFSET  11
 #define ROW_OFFSET                 2
-#define COLUMN_OFFSET              5
+#define COLUMN_OFFSET              6
 #define FW_BACK_OFFSET             2
 #define RESIZE_ROW_OFFSET          4
 #define RESIZE_COLUMN_OFFSET       8
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
index c3f3399e5f..54539c3297 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
@@ -76,12 +76,12 @@ UNICODE_TO_CHAR  UnicodeToPcAnsiOrAscii[] = {
 };
 
 CHAR16  mSetModeString[]           = { ESC, '[', '=', '3', 'h', 0 };
-CHAR16  mSetModeStringResize[]     = { ESC, '[', '8', ';', '0', '0', '0', ';', '0', '0', '0', 't', '0', 0 };
+CHAR16  mSetModeStringResize[]     = { ESC, '[', '8', ';', '0', '0', '0', ';', '0', '0', '0', 't', 0 };
 CHAR16  mSetAttributeString[]      = { ESC, '[', '0', 'm', ESC, '[', '4', '0', 'm', ESC, '[', '4', '0', 'm', 0 };
 CHAR16  mClearScreenString[]       = { ESC, '[', '2', 'J', 0 };
-CHAR16  mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 };
-CHAR16  mCursorForwardString[]     = { ESC, '[', '0', '0', 'C', 0 };
-CHAR16  mCursorBackwardString[]    = { ESC, '[', '0', '0', 'D', 0 };
+CHAR16  mSetCursorPositionString[] = { ESC, '[', '0', '0', '0', ';', '0', '0', '0', 'H', 0 };
+CHAR16  mCursorForwardString[]     = { ESC, '[', '0', '0', '0', 'C', 0 };
+CHAR16  mCursorBackwardString[]    = { ESC, '[', '0', '0', '0', 'D', 0 };
 
 //
 // Body of the ConOut functions
@@ -505,10 +505,10 @@ TerminalConOutSetMode (
     Rows    = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows;
 
     mSetModeStringResize[RESIZE_ROW_OFFSET + 0]    = (CHAR16)('0' + (Rows / 100));
-    mSetModeStringResize[RESIZE_ROW_OFFSET + 1]    = (CHAR16)('0' + ((Rows - ((Rows / 100) * 100)) / 10));
+    mSetModeStringResize[RESIZE_ROW_OFFSET + 1]    = (CHAR16)('0' + ((Rows % 100) / 10));
     mSetModeStringResize[RESIZE_ROW_OFFSET + 2]    = (CHAR16)('0' + (Rows % 10));
     mSetModeStringResize[RESIZE_COLUMN_OFFSET + 0] = (CHAR16)('0' + (Columns / 100));
-    mSetModeStringResize[RESIZE_COLUMN_OFFSET + 1] = (CHAR16)('0' + ((Columns - ((Columns / 100) * 100)) / 10));
+    mSetModeStringResize[RESIZE_COLUMN_OFFSET + 1] = (CHAR16)('0' + ((Columns % 100) / 10));
     mSetModeStringResize[RESIZE_COLUMN_OFFSET + 2] = (CHAR16)('0' + (Columns % 10));
 
     String = mSetModeStringResize;
@@ -812,21 +812,25 @@ TerminalConOutSetCursorPosition (
       ((UINTN)Mode->CursorRow == Row))
   {
     if ((UINTN)Mode->CursorColumn > Column) {
-      mCursorBackwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Mode->CursorColumn - Column) / 10));
-      mCursorBackwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + ((Mode->CursorColumn - Column) % 10));
+      mCursorBackwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Mode->CursorColumn - Column) / 100));
+      mCursorBackwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + (((Mode->CursorColumn - Column) % 100) / 10));
+      mCursorBackwardString[FW_BACK_OFFSET + 2] = (CHAR16)('0' + ((Mode->CursorColumn - Column) % 10));
       String                                    = mCursorBackwardString;
     } else if (Column > (UINTN)Mode->CursorColumn) {
-      mCursorForwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Column - Mode->CursorColumn) / 10));
-      mCursorForwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + ((Column - Mode->CursorColumn) % 10));
+      mCursorForwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Column - Mode->CursorColumn) / 100));
+      mCursorForwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + (((Column - Mode->CursorColumn) % 100) / 10));
+      mCursorForwardString[FW_BACK_OFFSET + 2] = (CHAR16)('0' + ((Column - Mode->CursorColumn) % 10));
       String                                   = mCursorForwardString;
     } else {
       String = L"";  // No cursor motion necessary
     }
   } else {
-    mSetCursorPositionString[ROW_OFFSET + 0]    = (CHAR16)('0' + ((Row + 1) / 10));
-    mSetCursorPositionString[ROW_OFFSET + 1]    = (CHAR16)('0' + ((Row + 1) % 10));
-    mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16)('0' + ((Column + 1) / 10));
-    mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16)('0' + ((Column + 1) % 10));
+    mSetCursorPositionString[ROW_OFFSET + 0]    = (CHAR16)('0' + ((Row + 1) / 100));
+    mSetCursorPositionString[ROW_OFFSET + 1]    = (CHAR16)('0' + (((Row + 1) % 100) / 10));
+    mSetCursorPositionString[ROW_OFFSET + 2]    = (CHAR16)('0' + ((Row + 1) % 10));
+    mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16)('0' + ((Column + 1) / 100));
+    mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16)('0' + (((Column + 1) % 100) / 10));
+    mSetCursorPositionString[COLUMN_OFFSET + 2] = (CHAR16)('0' + ((Column + 1) % 10));
     String                                      = mSetCursorPositionString;
   }
 
-- 
2.46.1

openSUSE Build Service is sponsored by