]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/Shell.c
ShellPkg: Check the unrecognized environment variable name before it is removed from...
[mirror_edk2.git] / ShellPkg / Application / Shell / Shell.c
index de46a72b44339469f6cdea0a223f600b7391e8b4..695880197b0b362fd4f6c34c655d101ec7768767 100644 (file)
@@ -142,6 +142,53 @@ FindNextInstance(
   return (Temp);\r
 }\r
 \r
+/**\r
+  Check whether the string between a pair of % is a valid envifronment variable name.\r
+\r
+  @param[in] BeginPercent       pointer to the first percent.\r
+  @param[in] EndPercent          pointer to the last percent.\r
+\r
+  @retval TRUE                          is a valid environment variable name.\r
+  @retval FALSE                         is NOT a valid environment variable name.\r
+**/\r
+BOOLEAN\r
+IsValidEnvironmentVariableName(\r
+  IN CONST CHAR16     *BeginPercent,\r
+  IN CONST CHAR16     *EndPercent\r
+  )\r
+{\r
+  CONST CHAR16    *Walker;\r
+  \r
+  Walker = NULL;\r
+\r
+  ASSERT (BeginPercent != NULL);\r
+  ASSERT (EndPercent != NULL);\r
+  ASSERT (BeginPercent < EndPercent);\r
+  \r
+  if ((BeginPercent + 1) == EndPercent) {\r
+    return FALSE;\r
+  }\r
+\r
+  for (Walker = BeginPercent + 1; Walker < EndPercent; Walker++) {\r
+    if (\r
+        (*Walker >= L'0' && *Walker <= L'9') ||\r
+        (*Walker >= L'A' && *Walker <= L'Z') ||\r
+        (*Walker >= L'a' && *Walker <= L'z') ||\r
+        (*Walker == L'_')\r
+      ) {\r
+      if (Walker == BeginPercent + 1 && (*Walker >= L'0' && *Walker <= L'9')) {\r
+        return FALSE;\r
+      } else {\r
+        continue;\r
+      }\r
+    } else {\r
+      return FALSE;\r
+    }\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
 /**\r
   Find a command line contains a split operation\r
 \r
@@ -1355,14 +1402,17 @@ StripUnreplacedEnvironmentVariables(
     }\r
     ASSERT(FirstPercent < FirstQuote);\r
     if (SecondPercent < FirstQuote) {\r
-      FirstPercent[0] = L'\"';\r
-      SecondPercent[0] = L'\"';\r
-\r
-      //\r
-      // We need to remove from FirstPercent to SecondPercent\r
-      //\r
-      CopyMem(FirstPercent + 1, SecondPercent, StrSize(SecondPercent));\r
-      CurrentLocator = FirstPercent + 2;\r
+      if (IsValidEnvironmentVariableName(FirstPercent, SecondPercent)) {\r
+        //\r
+        // We need to remove from FirstPercent to SecondPercent\r
+        //\r
+        CopyMem(FirstPercent, SecondPercent + 1, StrSize(SecondPercent + 1));\r
+        //\r
+        // dont need to update the locator.  both % characters are gone.\r
+        //\r
+      } else {\r
+        CurrentLocator = SecondPercent + 1;\r
+      }\r
       continue;\r
     }\r
     ASSERT(FirstQuote < SecondPercent);\r