Reviewed-by: Liming Gao <liming....@intel.com>

-----Original Message-----
From: Qiu, Shumin 
Sent: Friday, August 21, 2015 4:03 PM
To: edk2-devel@lists.01.org
Cc: Qiu, Shumin; Carsey, Jaben; Gao, Liming
Subject: [PATCH 3/3] MdePkg/Library/UefiFileHandleLib: Make FileHandleReadLine 
return the right buffer size.

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 <jaben.car...@intel.com>
Cc: Liming Gao <liming....@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <shumin....@intel.com>
---
 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
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to