ShellPkg: ShellFileHandleReadLine must return UCS2 lines.

An earlier change had this function returning the type of lines that were in 
the file being read (ASCII or UCS2).  The way it is used, UCS2 output is 
expected, even when the file being read is ASCII. This change restores that 
behavior and documents it.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jim Dailey 
---
diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c 
b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
index 4b53c70..abff0d3 100644
--- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c
+++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
@@ -4084,9 +4084,20 @@ ShellFileHandleReturnLine(
   If the position upon start is 0, then the Ascii Boolean will be set.  This 
should be
   maintained and not changed for all operations with the same file.
 
+  NOTE: LINES THAT ARE RETURNED BY THIS FUNCTION ARE UCS2, EVEN IF THE FILE 
BEING READ
+        IS IN ASCII FORMAT.
+
   @param[in]       Handle        SHELL_FILE_HANDLE to read from.
-  @param[in, out]  Buffer        The pointer to buffer to read into.
-  @param[in, out]  Size          The pointer to number of bytes in Buffer.
+  @param[in, out]  Buffer        The pointer to buffer to read into. If this 
function
+                                 returns EFI_SUCCESS, then on output Buffer 
will
+                                 contain a UCS2 string, even if the file being
+                                 read is ASCII.
+  @param[in, out]  Size          On input, pointer to number of bytes in 
Buffer.
+                                 On output, unchanged unless Buffer is too 
small
+                                 to contain the next line of the file. In that
+                                 case Size is set to the number of bytes needed
+                                 to hold the next line of the file (as a UCS2
+                                 string, even if it is an ASCII file).
   @param[in]       Truncate      If the buffer is large enough, this has no 
effect.
                                  If the buffer is is too small and Truncate is 
TRUE,
                                  the line will be truncated.
@@ -4165,43 +4176,27 @@ ShellFileHandleReadLine(
     //
     // if we have space save it...
     //
-    if ((CountSoFar + 1) * CharSize < *Size){
+    if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
       ASSERT(Buffer != NULL);
-      if (*Ascii) {
-        ((CHAR8*)Buffer)[CountSoFar] = (CHAR8) CharBuffer;
-        ((CHAR8*)Buffer)[CountSoFar+1] = '\0';
-      }
-      else {
-        ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
-        ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
-      }
+      ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
+      ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
     }
   }
 
   //
   // if we ran out of space tell when...
   //
-  if (Status != EFI_END_OF_FILE){
-    if ((CountSoFar + 1) * CharSize > *Size){
-      *Size = (CountSoFar + 1) * CharSize;
-      if (!Truncate) {
-        gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
-      } else {
-        DEBUG((DEBUG_WARN, "The line was truncated in 
ShellFileHandleReadLine"));
-      }
-      return (EFI_BUFFER_TOO_SMALL);
-    }
-
-    if (*Ascii) {
-      if (CountSoFar && ((CHAR8*)Buffer)[CountSoFar - 1] == '\r') {
-        ((CHAR8*)Buffer)[CountSoFar - 1] = '\0';
-      }
-    }
-    else {
-      if (CountSoFar && Buffer[CountSoFar - 1] == L'\r') {
-        Buffer[CountSoFar - 1] = CHAR_NULL;
-      }
+  if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
+    *Size = (CountSoFar+1)*sizeof(CHAR16);
+    if (!Truncate) {
+      gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
+    } else {
+      DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));
     }
+    return (EFI_BUFFER_TOO_SMALL);
+  }
+  while(Buffer[StrLen(Buffer)-1] == L'\r') {
+    Buffer[StrLen(Buffer)-1] = CHAR_NULL;
   }
 
   return (Status);

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to