Reviewed-by: Jaben Carsey <[email protected]> > -----Original Message----- > From: Qiu, Shumin > Sent: Friday, August 21, 2015 1:03 AM > To: [email protected] > Cc: Qiu, Shumin <[email protected]>; Carsey, Jaben > <[email protected]>; Gao, Liming <[email protected]> > Subject: [PATCH 3/3] MdePkg/Library/UefiFileHandleLib: Make > FileHandleReadLine return the right buffer size. > Importance: High > > 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

