1. '\r' char will not return in buffer so buffer size should exclude the number 
of '\r' char.
2. When 'Truncate' is TRUE return the truncated string with 'EFI_SUCCESS' 
status.

Cc: Jaben Carsey <[email protected]>
Cc: Liming Gao <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <[email protected]>
---
 MdePkg/Include/Library/FileHandleLib.h             |  2 ++
 .../Library/UefiFileHandleLib/UefiFileHandleLib.c  | 34 +++++++++++++++-------
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/MdePkg/Include/Library/FileHandleLib.h 
b/MdePkg/Include/Library/FileHandleLib.h
index b5ac19a..fdbdc3a 100644
--- a/MdePkg/Include/Library/FileHandleLib.h
+++ b/MdePkg/Include/Library/FileHandleLib.h
@@ -379,6 +379,8 @@ FileHandleGetFileName (
 
   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.
+  The function will not return the \r and \n character in buffer. When an 
empty line is
+  read a CHAR_NULL character will be returned in buffer.
 
   @param[in]       Handle        FileHandle to read from.
   @param[in, out]  Buffer        The pointer to buffer to read into.
diff --git a/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c 
b/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c
index 4223796..fee3f6e 100644
--- a/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c
+++ b/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c
@@ -917,6 +917,8 @@ FileHandleReturnLine(
 
   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.
+  The function will not return the \r and \n character in buffer. When an 
empty line is
+  read a CHAR_NULL character will be returned in buffer.
 
   @param[in]       Handle        FileHandle to read from.
   @param[in, out]  Buffer        The pointer to buffer to read into.
@@ -953,6 +955,7 @@ FileHandleReadLine(
   UINT64      FileSize;
   UINTN       CharSize;
   UINTN       CountSoFar;
+  UINTN       CrCount;
   UINT64      OriginalFilePosition;
 
   if (Handle == NULL
@@ -962,14 +965,15 @@ FileHandleReadLine(
     return (EFI_INVALID_PARAMETER);
   } 
   
-  if (Buffer != NULL) {
+  if (Buffer != NULL && *Size != 0) {
     *Buffer = CHAR_NULL;
-  }
+  } 
   
   Status = FileHandleGetSize (Handle, &FileSize);
   if (EFI_ERROR (Status)) {
     return Status;
   } else if (FileSize == 0) {
+    *Ascii = TRUE;
     return EFI_SUCCESS;
   }  
   
@@ -986,6 +990,7 @@ FileHandleReadLine(
     }
   }
 
+  CrCount = 0;
   for (CountSoFar = 0;;CountSoFar++){
     CharBuffer = 0;
     if (*Ascii) {
@@ -1000,31 +1005,38 @@ FileHandleReadLine(
        || (CharBuffer ==  '\n' && *Ascii)
      ){
       break;
+    } else if (
+        (CharBuffer == L'\r' && !(*Ascii)) ||
+        (CharBuffer ==  '\r' && *Ascii)
+      ) {
+      CrCount++;
+      continue;
     }
     //
     // if we have space save it...
     //
-    if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
+    if ((CountSoFar+1-CrCount)*sizeof(CHAR16) < *Size){
       ASSERT(Buffer != NULL);
-      ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
-      ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
+      ((CHAR16*)Buffer)[CountSoFar-CrCount] = CharBuffer;
+      ((CHAR16*)Buffer)[CountSoFar+1-CrCount] = CHAR_NULL;
     }
   }
 
   //
   // if we ran out of space tell when...
   //
-  if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
-    *Size = (CountSoFar+1)*sizeof(CHAR16);
+  if ((CountSoFar+1-CrCount)*sizeof(CHAR16) > *Size){
+    *Size = (CountSoFar+1-CrCount)*sizeof(CHAR16);
     if (!Truncate) {
+      if (Buffer != NULL && *Size != 0) {
+        ZeroMem(Buffer, *Size);
+      }
       FileHandleSetPosition(Handle, OriginalFilePosition);
+      return (EFI_BUFFER_TOO_SMALL);
     } else {
       DEBUG((DEBUG_WARN, "The line was truncated in FileHandleReadLine"));
+      return (EFI_SUCCESS);
     }
-    return (EFI_BUFFER_TOO_SMALL);
-  }
-  while(Buffer[StrLen(Buffer)-1] == L'\r') {
-    Buffer[StrLen(Buffer)-1] = CHAR_NULL;
   }
 
   return (Status);
-- 
1.9.5.msysgit.1

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

Reply via email to