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

Reply via email to