From 307f2ce4e8e70f9ec5fed8b0609ff1f613abfdc6 Mon Sep 17 00:00:00 2001 From: Tapan Shah Date: Wed, 3 Jun 2015 20:34:48 +0000 Subject: [PATCH] ShellPkg: Handle escape characters properly for parse command MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit parse command does not remove escape character ^ if used to pass special characters like ^ , “ in a quoted -sfo output string. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Tapan Shah Reviewed-by: Jaben Carsey git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17556 6f19259b-4bc3-4df7-8a09-765794883524 --- .../UefiShellLevel2CommandsLib/Parse.c | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c index 545b7af342..687ced6b63 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c @@ -188,6 +188,52 @@ ParseReturnStdInLine ( return (RetVal); } +/** + Handle stings for SFO Output with escape character ^ in a string + 1. Quotation marks in the string must be escaped by using a ^ character (i.e. ^”). + 2. The ^ character may be inserted using ^^. + + @param[in] String The Unicode NULL-terminated string. + + @retval NewString The new string handled for SFO. +**/ +EFI_STRING +HandleStringWithEscapeCharForParse ( + IN CHAR16 *String + ) +{ + EFI_STRING NewStr; + EFI_STRING StrWalker; + EFI_STRING ReturnStr; + + if (String == NULL) { + return NULL; + } + + // + // start to parse the input string. + // + NewStr = AllocateZeroPool (StrSize (String)); + if (NewStr == NULL) { + return NULL; + } + ReturnStr = NewStr; + StrWalker = String; + while (*StrWalker != CHAR_NULL) { + if (*StrWalker == L'^' && (*(StrWalker + 1) == L'^' || *(StrWalker + 1) == L'"')) { + *NewStr = *(StrWalker + 1); + StrWalker++; + } else { + *NewStr = *StrWalker; + } + StrWalker++; + NewStr++; + } + + return ReturnStr; +} + + /** Do the actual parsing of the file. the file should be SFO output from a shell command or a similar format. @@ -222,6 +268,7 @@ PerformParsing( CHAR16 *ColumnPointer; SHELL_STATUS ShellStatus; CHAR16 *TempSpot; + CHAR16 *SfoString; ASSERT(FileName != NULL); ASSERT(TableName != NULL); @@ -299,8 +346,11 @@ PerformParsing( if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen (ColumnPointer) - 1] == L'\"'){ ColumnPointer[StrLen (ColumnPointer) - 1] = CHAR_NULL; } - - ShellPrintEx (-1, -1, L"%s\r\n", ColumnPointer); + SfoString = HandleStringWithEscapeCharForParse (ColumnPointer); + if (SfoString != NULL) { + ShellPrintEx (-1, -1, L"%s\r\n", SfoString); + SHELL_FREE_NON_NULL (SfoString); + } } } } -- 2.39.2