From 48cb33ec30c1b38664ed6b541c4ab61d6226d84b Mon Sep 17 00:00:00 2001 From: Qiu Shumin Date: Thu, 15 Oct 2015 02:43:31 +0000 Subject: [PATCH] ShellPkg: Fix ASCII input redirection does not work correctly. When executing 'ls -b Signed-off-by: Felix Poludov Signed-off-by: Oleksiy Yakovlev Reviewed-by: Jaben Carsey git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18609 6f19259b-4bc3-4df7-8a09-765794883524 --- ShellPkg/Application/Shell/ConsoleWrappers.c | 14 +++++++-- .../Application/Shell/FileHandleWrappers.c | 29 +++++++++++++++---- .../Shell/ShellParametersProtocol.c | 4 +++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/ShellPkg/Application/Shell/ConsoleWrappers.c b/ShellPkg/Application/Shell/ConsoleWrappers.c index feea6ef3a2..04a7513a33 100644 --- a/ShellPkg/Application/Shell/ConsoleWrappers.c +++ b/ShellPkg/Application/Shell/ConsoleWrappers.c @@ -2,7 +2,7 @@ Function definitions for shell simple text in and out on top of file handles. (C) Copyright 2013 Hewlett-Packard Development Company, L.P.
- Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -15,6 +15,8 @@ #include "Shell.h" +extern BOOLEAN AsciiRedirection; + typedef struct { EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn; SHELL_FILE_HANDLE FileHandle; @@ -81,6 +83,7 @@ FileBasedSimpleTextInReadKeyStroke( ) { UINTN Size; + UINTN CharSize; // // Verify the parameters @@ -98,11 +101,16 @@ FileBasedSimpleTextInReadKeyStroke( Size = sizeof(CHAR16); + if(!AsciiRedirection) { + CharSize = sizeof(CHAR16); + } else { + CharSize = sizeof(CHAR8); + } // // Decrement the amount of free space by Size or set to zero (for odd length files) // - if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile > Size) { - ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= Size; + if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile > CharSize) { + ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= CharSize; } else { ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile = 0; } diff --git a/ShellPkg/Application/Shell/FileHandleWrappers.c b/ShellPkg/Application/Shell/FileHandleWrappers.c index 18b6c3e768..91c35f7cb7 100644 --- a/ShellPkg/Application/Shell/FileHandleWrappers.c +++ b/ShellPkg/Application/Shell/FileHandleWrappers.c @@ -1670,8 +1670,10 @@ FileInterfaceFileRead( OUT VOID *Buffer ) { - CHAR8 *AsciiBuffer; + CHAR8 *AsciiStrBuffer; + CHAR16 *UscStrBuffer; UINTN Size; + UINTN CharNum; EFI_STATUS Status; if (((EFI_FILE_PROTOCOL_FILE*)This)->Unicode) { // @@ -1682,10 +1684,27 @@ FileInterfaceFileRead( // // Ascii // - AsciiBuffer = AllocateZeroPool((Size = *BufferSize)); - Status = (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Read(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, &Size, AsciiBuffer)); - UnicodeSPrint(Buffer, *BufferSize, L"%a", AsciiBuffer); - FreePool(AsciiBuffer); + Size = (*BufferSize) / sizeof(CHAR16); + AsciiStrBuffer = AllocateZeroPool(Size + sizeof(CHAR8)); + if (AsciiStrBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + UscStrBuffer = AllocateZeroPool(*BufferSize + sizeof(CHAR16)); + if (UscStrBuffer== NULL) { + SHELL_FREE_NON_NULL(AsciiStrBuffer); + return EFI_OUT_OF_RESOURCES; + } + Status = (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Read(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, &Size, AsciiStrBuffer)); + if (!EFI_ERROR(Status)) { + CharNum = UnicodeSPrint(UscStrBuffer, *BufferSize + sizeof(CHAR16), L"%a", AsciiStrBuffer); + if (CharNum == Size) { + CopyMem (Buffer, UscStrBuffer, *BufferSize); + } else { + Status = EFI_UNSUPPORTED; + } + } + SHELL_FREE_NON_NULL(AsciiStrBuffer); + SHELL_FREE_NON_NULL(UscStrBuffer); return (Status); } } diff --git a/ShellPkg/Application/Shell/ShellParametersProtocol.c b/ShellPkg/Application/Shell/ShellParametersProtocol.c index bbe026b644..9c502f8f21 100644 --- a/ShellPkg/Application/Shell/ShellParametersProtocol.c +++ b/ShellPkg/Application/Shell/ShellParametersProtocol.c @@ -17,6 +17,8 @@ #include "Shell.h" +BOOLEAN AsciiRedirection = FALSE; + /** Return the next parameter's end from a command line string. @@ -726,6 +728,7 @@ UpdateStdInStdOutStdErr( OutUnicode = TRUE; InUnicode = TRUE; + AsciiRedirection = FALSE; ErrUnicode = TRUE; StdInVarName = NULL; StdOutVarName = NULL; @@ -1004,6 +1007,7 @@ UpdateStdInStdOutStdErr( } else { StdInFileName = CommandLineWalker += 4; InUnicode = FALSE; + AsciiRedirection = TRUE; } if (StrStr(CommandLineWalker, L"