]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg/ShellProtocol.c: Fix case sensitivity in GetAlias and SetAlias
authorBrendan Jackman <Brendan.Jackman@arm.com>
Wed, 26 Feb 2014 09:46:40 +0000 (09:46 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Feb 2014 09:46:40 +0000 (09:46 +0000)
ShellCommandIsOnAliasList is case insensitive, but GetAlias and SetAlias use the
UEFI variable services, which are case sensitive.

Force alias names to lowercase to get around this.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brendan Jackman <Brendan.Jackman@arm.com>
Reviewed-By: Olivier Martin <olivier.martin@arm.com>
Reviewed-by: Jaben Carsey <Jaben.carsey@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15270 6f19259b-4bc3-4df7-8a09-765794883524

ShellPkg/Application/Shell/ShellProtocol.c

index 52904e9e024f8888c7560f7c80dccabecd64c973..31037bfdc5d906d55ef524357006e7c334ddce34 100644 (file)
@@ -2992,6 +2992,26 @@ InternalEfiShellGetListAlias(
   return (RetVal);\r
 }\r
 \r
+/**\r
+  Convert a null-terminated unicode string, in-place, to all lowercase.\r
+  Then return it.\r
+**/\r
+STATIC\r
+CHAR16 *\r
+ToLower (\r
+  CHAR16 *Str\r
+  )\r
+{\r
+  UINTN Index;\r
+\r
+  for (Index = 0; Str[Index] != L'\0'; Index++) {\r
+    if (Str[Index] >= L'A' && Str[Index] <= L'Z') {\r
+      Str[Index] -= (L'A' - L'a');\r
+    }\r
+  }\r
+  return Str;\r
+}\r
+\r
 /**\r
   This function returns the command associated with a alias or a list of all\r
   alias'.\r
@@ -3021,17 +3041,23 @@ EfiShellGetAlias(
   UINTN       RetSize;\r
   UINT32      Attribs;\r
   EFI_STATUS  Status;\r
+  CHAR16      *AliasLower;\r
 \r
+  // Convert to lowercase to make aliases case-insensitive\r
   if (Alias != NULL) {\r
+    AliasLower = AllocateCopyPool (StrSize (Alias), Alias);\r
+    ASSERT (AliasLower != NULL);\r
+    ToLower (AliasLower);\r
+\r
     if (Volatile == NULL) {\r
-      return (AddBufferToFreeList(GetVariable((CHAR16*)Alias, &gShellAliasGuid)));\r
+      return (AddBufferToFreeList(GetVariable(AliasLower, &gShellAliasGuid)));\r
     }\r
     RetSize = 0;\r
     RetVal = NULL;\r
-    Status = gRT->GetVariable((CHAR16*)Alias, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
+    Status = gRT->GetVariable(AliasLower, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
       RetVal = AllocateZeroPool(RetSize);\r
-      Status = gRT->GetVariable((CHAR16*)Alias, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
+      Status = gRT->GetVariable(AliasLower, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
     }\r
     if (EFI_ERROR(Status)) {\r
       if (RetVal != NULL) {\r
@@ -3045,6 +3071,7 @@ EfiShellGetAlias(
       *Volatile = TRUE;\r
     }\r
 \r
+    FreePool (AliasLower);\r
     return (AddBufferToFreeList(RetVal));\r
   }\r
   return (AddBufferToFreeList(InternalEfiShellGetListAlias()));\r
@@ -3074,6 +3101,18 @@ InternalSetAlias(
   IN BOOLEAN Volatile\r
   )\r
 {\r
+  EFI_STATUS  Status;\r
+  CHAR16      *AliasLower;\r
+\r
+  // Convert to lowercase to make aliases case-insensitive\r
+  if (Alias != NULL) {\r
+    AliasLower = AllocateCopyPool (StrSize (Alias), Alias);\r
+    ASSERT (AliasLower != NULL);\r
+    ToLower (AliasLower);\r
+  } else {\r
+    AliasLower = NULL;\r
+  }\r
+\r
   //\r
   // We must be trying to remove one if Alias is NULL\r
   //\r
@@ -3081,7 +3120,7 @@ InternalSetAlias(
     //\r
     // remove an alias (but passed in COMMAND parameter)\r
     //\r
-    return (gRT->SetVariable((CHAR16*)Command, &gShellAliasGuid, 0, 0, NULL));\r
+    Status = (gRT->SetVariable((CHAR16*)Command, &gShellAliasGuid, 0, 0, NULL));\r
   } else {\r
     //\r
     // Add and replace are the same\r
@@ -3090,8 +3129,13 @@ InternalSetAlias(
     // We dont check the error return on purpose since the variable may not exist.\r
     gRT->SetVariable((CHAR16*)Command, &gShellAliasGuid, 0, 0, NULL);\r
 \r
-    return (gRT->SetVariable((CHAR16*)Alias, &gShellAliasGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS|(Volatile?0:EFI_VARIABLE_NON_VOLATILE), StrSize(Command), (VOID*)Command));\r
+    Status = (gRT->SetVariable((CHAR16*)Alias, &gShellAliasGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS|(Volatile?0:EFI_VARIABLE_NON_VOLATILE), StrSize(Command), (VOID*)Command));\r
   }\r
+\r
+  if (Alias != NULL) {\r
+    FreePool (AliasLower);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -3113,6 +3157,7 @@ InternalSetAlias(
   @retval EFI_NOT_FOUND         the Alias intended to be deleted was not found\r
   @retval EFI_ACCESS_DENIED     The alias is a built-in alias or already existed and Replace was set to\r
                                 FALSE.\r
+  @retval EFI_INVALID_PARAMETER Command is null or the empty string.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -3123,21 +3168,24 @@ EfiShellSetAlias(
   IN BOOLEAN Volatile\r
   )\r
 {\r
-  //\r
-  // cant set over a built in alias\r
-  //\r
   if (ShellCommandIsOnAliasList(Alias==NULL?Command:Alias)) {\r
+    //\r
+    // cant set over a built in alias\r
+    //\r
     return (EFI_ACCESS_DENIED);\r
-  }\r
-  if (Command == NULL || *Command == CHAR_NULL || StrLen(Command) == 0) {\r
+  } else if (Command == NULL || *Command == CHAR_NULL || StrLen(Command) == 0) {\r
+    //\r
+    // Command is null or empty\r
+    //\r
     return (EFI_INVALID_PARAMETER);\r
-  }\r
-\r
-  if (EfiShellGetAlias(Command, NULL) != NULL && !Replace) {\r
+  } else if (EfiShellGetAlias(Command, NULL) != NULL && !Replace) {\r
+    //\r
+    // Alias already exists, Replace not set\r
+    //\r
     return (EFI_ACCESS_DENIED);\r
+  } else {\r
+    return (InternalSetAlias(Command, Alias, Volatile));\r
   }\r
-\r
-  return (InternalSetAlias(Command, Alias, Volatile));\r
 }\r
 \r
 // Pure FILE_HANDLE operations are passed to FileHandleLib\r