Revision: 19394
          http://sourceforge.net/p/edk2/code/19394
Author:   vanjeff
Date:     2015-12-18 07:29:05 +0000 (Fri, 18 Dec 2015)
Log Message:
-----------
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.

(Sync patch r18609 from main trunk.)

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <[email protected]>
Signed-off-by: Felix Poludov <[email protected]>
Signed-off-by: Oleksiy Yakovlev <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>

Revision Links:
--------------
    http://sourceforge.net/p/edk2/code/18609

Modified Paths:
--------------
    branches/UDK2015/ShellPkg/Application/Shell/ConsoleWrappers.c
    branches/UDK2015/ShellPkg/Application/Shell/FileHandleWrappers.c
    branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c

Modified: branches/UDK2015/ShellPkg/Application/Shell/ConsoleWrappers.c
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/ConsoleWrappers.c       
2015-12-18 07:28:26 UTC (rev 19393)
+++ branches/UDK2015/ShellPkg/Application/Shell/ConsoleWrappers.c       
2015-12-18 07:29:05 UTC (rev 19394)
@@ -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.<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
   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 @@
   )
 {
   UINTN Size;
+  UINTN CharSize;
 
   //
   // Verify the parameters
@@ -98,11 +101,16 @@
 
   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;
   }

Modified: branches/UDK2015/ShellPkg/Application/Shell/FileHandleWrappers.c
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/FileHandleWrappers.c    
2015-12-18 07:28:26 UTC (rev 19393)
+++ branches/UDK2015/ShellPkg/Application/Shell/FileHandleWrappers.c    
2015-12-18 07:29:05 UTC (rev 19394)
@@ -1670,8 +1670,10 @@
   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 @@
     //
     // 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);
   }
 }

Modified: branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c
===================================================================
--- branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c       
2015-12-18 07:28:26 UTC (rev 19393)
+++ branches/UDK2015/ShellPkg/Application/Shell/ShellParametersProtocol.c       
2015-12-18 07:29:05 UTC (rev 19394)
@@ -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 @@
 
   OutUnicode      = TRUE;
   InUnicode       = TRUE;
+  AsciiRedirection = FALSE;
   ErrUnicode      = TRUE;
   StdInVarName    = NULL;
   StdOutVarName   = NULL;
@@ -1004,6 +1007,7 @@
     } else {
       StdInFileName   = CommandLineWalker += 4;
       InUnicode       = FALSE;
+      AsciiRedirection = TRUE;
     }
     if (StrStr(CommandLineWalker, L" <a ") != NULL) {
       Status = EFI_NOT_FOUND;


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to