]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/FileHandleWrappers.c
ShellPkg: Fix Shell ASSERT when read 'TAB' key fail from 'ConIn'.
[mirror_edk2.git] / ShellPkg / Application / Shell / FileHandleWrappers.c
index 893e5ffc0466cc59f7b0dc38855848778ae14f3a..0e5efe30255631f36b972715c49a464970f88677 100644 (file)
@@ -18,6 +18,8 @@
 #include "Shell.h"\r
 #include "FileHandleInternal.h"\r
 \r
+#define MEM_WRITE_REALLOC_OVERHEAD 1024\r
+\r
 /**\r
   File style interface for console (Open).  \r
   \r
@@ -160,9 +162,11 @@ FileInterfaceStdOutWrite(
 {\r
   if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {\r
     return (EFI_UNSUPPORTED);\r
-  } else {\r
-    return (gST->ConOut->OutputString(gST->ConOut, Buffer));\r
   }\r
+  if (*((CHAR16 *)Buffer) == gUnicodeFileTag) {\r
+    return (gST->ConOut->OutputString(gST->ConOut, (CHAR16 *)Buffer + 1));\r
+  }\r
+  return (gST->ConOut->OutputString(gST->ConOut, Buffer));\r
 }\r
 \r
 /**\r
@@ -568,8 +572,7 @@ FileInterfaceStdInRead(
             TabLinePos = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FoundFileList->Link);\r
             InTabScrolling = TRUE;\r
           } else {\r
-            FreePool(FoundFileList);\r
-            FoundFileList = NULL;\r
+            ShellInfoObject.NewEfiShellProtocol->FreeFileList (&FoundFileList);\r
           }\r
         }\r
       }\r
@@ -852,6 +855,9 @@ FileInterfaceStdInRead(
   // if this was used it should be deallocated by now...\r
   // prevent memory leaks...\r
   //\r
+  if (FoundFileList != NULL) {\r
+    ShellInfoObject.NewEfiShellProtocol->FreeFileList (&FoundFileList);\r
+  }\r
   ASSERT(FoundFileList == NULL);\r
 \r
   return Status;\r
@@ -1396,8 +1402,8 @@ FileInterfaceMemWrite(
     // Unicode\r
     //\r
     if ((UINTN)(MemFile->Position + (*BufferSize)) > (UINTN)(MemFile->BufferSize)) {\r
-      MemFile->Buffer = ReallocatePool((UINTN)(MemFile->BufferSize), (UINTN)(MemFile->BufferSize) + (*BufferSize) + 10, MemFile->Buffer);\r
-      MemFile->BufferSize += (*BufferSize) + 10;\r
+      MemFile->Buffer = ReallocatePool((UINTN)(MemFile->BufferSize), (UINTN)(MemFile->BufferSize) + (*BufferSize) + MEM_WRITE_REALLOC_OVERHEAD, MemFile->Buffer);\r
+      MemFile->BufferSize += (*BufferSize) + MEM_WRITE_REALLOC_OVERHEAD;\r
     }\r
     CopyMem(((UINT8*)MemFile->Buffer) + MemFile->Position, Buffer, *BufferSize);\r
     MemFile->Position += (*BufferSize);\r
@@ -1413,8 +1419,8 @@ FileInterfaceMemWrite(
     }\r
     AsciiSPrint(AsciiBuffer, *BufferSize, "%S", Buffer);\r
     if ((UINTN)(MemFile->Position + AsciiStrSize(AsciiBuffer)) > (UINTN)(MemFile->BufferSize)) {\r
-      MemFile->Buffer = ReallocatePool((UINTN)(MemFile->BufferSize), (UINTN)(MemFile->BufferSize) + AsciiStrSize(AsciiBuffer) + 10, MemFile->Buffer);\r
-      MemFile->BufferSize += AsciiStrSize(AsciiBuffer) + 10;\r
+      MemFile->Buffer = ReallocatePool((UINTN)(MemFile->BufferSize), (UINTN)(MemFile->BufferSize) + AsciiStrSize(AsciiBuffer) + MEM_WRITE_REALLOC_OVERHEAD, MemFile->Buffer);\r
+      MemFile->BufferSize += AsciiStrSize(AsciiBuffer) + MEM_WRITE_REALLOC_OVERHEAD;\r
     }\r
     CopyMem(((UINT8*)MemFile->Buffer) + MemFile->Position, AsciiBuffer, AsciiStrSize(AsciiBuffer));\r
     MemFile->Position += (*BufferSize / sizeof(CHAR16));\r