ShellPkg: Fix ASCII input redirection does not work correctly.

When executing 'ls -b <a arg.txt' Shell cannot get the ASCII char in 'arg.txt' correctly. 
This patch updates the file read buffer size when read from ASCII file to fix the bug.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <shumin.qiu@intel.com>
Signed-off-by: Felix Poludov <Felixp@ami.com>
Signed-off-by: Oleksiy Yakovlev <Oleksiyy@ami.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18609 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Qiu Shumin
2015-10-15 02:43:31 +00:00
committed by shenshushi
parent da6b8feb22
commit 48cb33ec30
3 changed files with 39 additions and 8 deletions

View File

@ -2,7 +2,7 @@
Function definitions for shell simple text in and out on top of file handles. Function definitions for shell simple text in and out on top of file handles.
(C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR> (C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>
Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -15,6 +15,8 @@
#include "Shell.h" #include "Shell.h"
extern BOOLEAN AsciiRedirection;
typedef struct { typedef struct {
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn; EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
SHELL_FILE_HANDLE FileHandle; SHELL_FILE_HANDLE FileHandle;
@ -81,6 +83,7 @@ FileBasedSimpleTextInReadKeyStroke(
) )
{ {
UINTN Size; UINTN Size;
UINTN CharSize;
// //
// Verify the parameters // Verify the parameters
@ -98,11 +101,16 @@ FileBasedSimpleTextInReadKeyStroke(
Size = sizeof(CHAR16); 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) // 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) { if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile > CharSize) {
((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= Size; ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= CharSize;
} else { } else {
((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile = 0; ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile = 0;
} }

View File

@ -1670,8 +1670,10 @@ FileInterfaceFileRead(
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
CHAR8 *AsciiBuffer; CHAR8 *AsciiStrBuffer;
CHAR16 *UscStrBuffer;
UINTN Size; UINTN Size;
UINTN CharNum;
EFI_STATUS Status; EFI_STATUS Status;
if (((EFI_FILE_PROTOCOL_FILE*)This)->Unicode) { if (((EFI_FILE_PROTOCOL_FILE*)This)->Unicode) {
// //
@ -1682,10 +1684,27 @@ FileInterfaceFileRead(
// //
// Ascii // Ascii
// //
AsciiBuffer = AllocateZeroPool((Size = *BufferSize)); Size = (*BufferSize) / sizeof(CHAR16);
Status = (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Read(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, &Size, AsciiBuffer)); AsciiStrBuffer = AllocateZeroPool(Size + sizeof(CHAR8));
UnicodeSPrint(Buffer, *BufferSize, L"%a", AsciiBuffer); if (AsciiStrBuffer == NULL) {
FreePool(AsciiBuffer); 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); return (Status);
} }
} }

View File

@ -17,6 +17,8 @@
#include "Shell.h" #include "Shell.h"
BOOLEAN AsciiRedirection = FALSE;
/** /**
Return the next parameter's end from a command line string. Return the next parameter's end from a command line string.
@ -726,6 +728,7 @@ UpdateStdInStdOutStdErr(
OutUnicode = TRUE; OutUnicode = TRUE;
InUnicode = TRUE; InUnicode = TRUE;
AsciiRedirection = FALSE;
ErrUnicode = TRUE; ErrUnicode = TRUE;
StdInVarName = NULL; StdInVarName = NULL;
StdOutVarName = NULL; StdOutVarName = NULL;
@ -1004,6 +1007,7 @@ UpdateStdInStdOutStdErr(
} else { } else {
StdInFileName = CommandLineWalker += 4; StdInFileName = CommandLineWalker += 4;
InUnicode = FALSE; InUnicode = FALSE;
AsciiRedirection = TRUE;
} }
if (StrStr(CommandLineWalker, L" <a ") != NULL) { if (StrStr(CommandLineWalker, L" <a ") != NULL) {
Status = EFI_NOT_FOUND; Status = EFI_NOT_FOUND;