ShellPkg/set: Fix EfiShellSetEnv to use case sensitive compare

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=777

Per Shell spec, the environment variable has a case-sensitive name.
But today's implementation of EfiShellSetEnv() compares the
environment variable name case insensitively, which causes variable
like "CWD" cannot be set due to "cwd" is pre-defined variable.

The patch fixes this issue.

The EfiShellGetEnv() doesn't have such issue because it will
call into ShellFindEnvVarInList() which uses StrCmp().

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Jim Dailey <jim_dailey@dell.com>
This commit is contained in:
Ruiyu Ni 2018-08-07 17:13:07 +08:00
parent 855698fb69
commit 0e967dff06
1 changed files with 9 additions and 30 deletions

View File

@ -2924,36 +2924,15 @@ EfiShellSetEnv(
//
// Make sure we dont 'set' a predefined read only variable
//
if (gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
L"cwd") == 0
||gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
L"Lasterror") == 0
||gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
L"profiles") == 0
||gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
L"uefishellsupport") == 0
||gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
L"uefishellversion") == 0
||gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
L"uefiversion") == 0
||(!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest &&
gUnicodeCollation->StriColl(
gUnicodeCollation,
(CHAR16*)Name,
(CHAR16*)mNoNestingEnvVarName) == 0)
){
if ((StrCmp (Name, L"cwd") == 0) ||
(StrCmp (Name, L"lasterror") == 0) ||
(StrCmp (Name, L"profiles") == 0) ||
(StrCmp (Name, L"uefishellsupport") == 0) ||
(StrCmp (Name, L"uefishellversion") == 0) ||
(StrCmp (Name, L"uefiversion") == 0) ||
(!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest &&
StrCmp (Name, mNoNestingEnvVarName) == 0)
) {
return (EFI_INVALID_PARAMETER);
}
return (InternalEfiShellSetEnv(Name, Value, Volatile));