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

