Reviewed-by: Jaben Carsey <[email protected]>

> -----Original Message-----
> From: Ryan Harkin [mailto:[email protected]]
> Sent: Wednesday, February 10, 2016 6:16 AM
> To: [email protected]
> Cc: [email protected]; Carsey, Jaben <[email protected]>; Qiu,
> Shumin <[email protected]>
> Subject: Re: [edk2] [PATCH] ShellPkg: ShellFileHandleReadLine must return
> UCS2 lines
> Importance: High
> 
> 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