Hi Jim,

Thanks for the quick fix!  It works for me on ARM Juno R0, R1 and R2
and Versatile Express TC2.

On 10 February 2016 at 13:45,  <[email protected]> wrote:
> ShellPkg: ShellFileHandleReadLine must return UCS2 lines.
>
> An earlier change had this function returning the type of lines that were in 
> the file being read (ASCII or UCS2).  The way it is used, UCS2 output is 
> expected, even when the file being read is ASCII. This change restores that 
> behavior and documents it.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jim Dailey
^^ your email address is missing from your sign-off, I think it's
mandatory, but don't hold me to that.

I haven't had chance to read and understand the code, but I can at
least provide:

Tested-by: Ryan Harkin <[email protected]>

Thanks,
Ryan.

> ---
> diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c 
> b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
> index 4b53c70..abff0d3 100644
> --- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c
> +++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
> @@ -4084,9 +4084,20 @@ ShellFileHandleReturnLine(
>    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.
>
> +  NOTE: LINES THAT ARE RETURNED BY THIS FUNCTION ARE UCS2, EVEN IF THE FILE 
> BEING READ
> +        IS IN ASCII FORMAT.
> +
>    @param[in]       Handle        SHELL_FILE_HANDLE to read from.
> -  @param[in, out]  Buffer        The pointer to buffer to read into.
> -  @param[in, out]  Size          The pointer to number of bytes in Buffer.
> +  @param[in, out]  Buffer        The pointer to buffer to read into. If this 
> function
> +                                 returns EFI_SUCCESS, then on output Buffer 
> will
> +                                 contain a UCS2 string, even if the file 
> being
> +                                 read is ASCII.
> +  @param[in, out]  Size          On input, pointer to number of bytes in 
> Buffer.
> +                                 On output, unchanged unless Buffer is too 
> small
> +                                 to contain the next line of the file. In 
> that
> +                                 case Size is set to the number of bytes 
> needed
> +                                 to hold the next line of the file (as a UCS2
> +                                 string, even if it is an ASCII file).
>    @param[in]       Truncate      If the buffer is large enough, this has no 
> effect.
>                                   If the buffer is is too small and Truncate 
> is TRUE,
>                                   the line will be truncated.
> @@ -4165,43 +4176,27 @@ ShellFileHandleReadLine(
>      //
>      // if we have space save it...
>      //
> -    if ((CountSoFar + 1) * CharSize < *Size){
> +    if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
>        ASSERT(Buffer != NULL);
> -      if (*Ascii) {
> -        ((CHAR8*)Buffer)[CountSoFar] = (CHAR8) CharBuffer;
> -        ((CHAR8*)Buffer)[CountSoFar+1] = '\0';
> -      }
> -      else {
> -        ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
> -        ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
> -      }
> +      ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
> +      ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
>      }
>    }
>
>    //
>    // if we ran out of space tell when...
>    //
> -  if (Status != EFI_END_OF_FILE){
> -    if ((CountSoFar + 1) * CharSize > *Size){
> -      *Size = (CountSoFar + 1) * CharSize;
> -      if (!Truncate) {
> -        gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
> -      } else {
> -        DEBUG((DEBUG_WARN, "The line was truncated in 
> ShellFileHandleReadLine"));
> -      }
> -      return (EFI_BUFFER_TOO_SMALL);
> -    }
> -
> -    if (*Ascii) {
> -      if (CountSoFar && ((CHAR8*)Buffer)[CountSoFar - 1] == '\r') {
> -        ((CHAR8*)Buffer)[CountSoFar - 1] = '\0';
> -      }
> -    }
> -    else {
> -      if (CountSoFar && Buffer[CountSoFar - 1] == L'\r') {
> -        Buffer[CountSoFar - 1] = CHAR_NULL;
> -      }
> +  if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
> +    *Size = (CountSoFar+1)*sizeof(CHAR16);
> +    if (!Truncate) {
> +      gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
> +    } else {
> +      DEBUG((DEBUG_WARN, "The line was truncated in 
> ShellFileHandleReadLine"));
>      }
> +    return (EFI_BUFFER_TOO_SMALL);
> +  }
> +  while(Buffer[StrLen(Buffer)-1] == L'\r') {
> +    Buffer[StrLen(Buffer)-1] = CHAR_NULL;
>    }
>
>    return (Status);
>
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to