From 43b3c498bda4f1e2c96772d1e1af956cabae6cf5 Mon Sep 17 00:00:00 2001 From: Qiu Shumin Date: Tue, 15 Sep 2015 05:40:43 +0000 Subject: ShellPkg: Fix Shell does not support ASCII pipe(|a). (Sync patch r18452 from main trunk.) Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Qiu Shumin Reviewed-by: Jaben Carsey git-svn-id: https://svn.code.sf.net/p/edk2/code/branches/UDK2015@18462 6f19259b-4bc3-4df7-8a09-765794883524 --- ShellPkg/Application/Shell/Shell.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'ShellPkg/Application/Shell') diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 78a64de19e..03f5e4f05f 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -1578,11 +1578,18 @@ RunSplitCommand( SHELL_FREE_NON_NULL(OurCommandLine); SHELL_FREE_NON_NULL(NextCommandLine); return (EFI_INVALID_PARAMETER); - } else if (NextCommandLine[0] != CHAR_NULL && - NextCommandLine[0] == L'a' && - NextCommandLine[1] == L' ' - ){ + } else if (NextCommandLine[0] == L'a' && + (NextCommandLine[1] == L' ' || NextCommandLine[1] == CHAR_NULL) + ){ CopyMem(NextCommandLine, NextCommandLine+1, StrSize(NextCommandLine) - sizeof(NextCommandLine[0])); + while (NextCommandLine[0] == L' ') { + CopyMem(NextCommandLine, NextCommandLine+1, StrSize(NextCommandLine) - sizeof(NextCommandLine[0])); + } + if (NextCommandLine[0] == CHAR_NULL) { + SHELL_FREE_NON_NULL(OurCommandLine); + SHELL_FREE_NON_NULL(NextCommandLine); + return (EFI_INVALID_PARAMETER); + } Unicode = FALSE; } else { Unicode = TRUE; @@ -1884,24 +1891,31 @@ VerifySplit( EFI_STATUS Status; // - // Verify up to the pipe or end character + // If this was the only item, then get out // - Status = IsValidSplit(CmdLine); - if (EFI_ERROR(Status)) { - return (Status); + if (!ContainsSplit(CmdLine)) { + return (EFI_SUCCESS); } // - // If this was the only item, then get out + // Verify up to the pipe or end character // - if (!ContainsSplit(CmdLine)) { - return (EFI_SUCCESS); + Status = IsValidSplit(CmdLine); + if (EFI_ERROR(Status)) { + return (Status); } // // recurse to verify the next item // TempSpot = FindFirstCharacter(CmdLine, L"|", L'^') + 1; + if (*TempSpot == L'a' && + (*(TempSpot + 1) == L' ' || *(TempSpot + 1) == CHAR_NULL) + ) { + // If it's an ASCII pipe '|a' + TempSpot += 1; + } + return (VerifySplit(TempSpot)); } -- cgit v1.2.3