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