]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c
rm - refine user input validation to prevent removal of CWD.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Rm.c
index ea3792a3be1fb8a33b44c623643e507f244ee974..32b7580103ff4641a1462b4040396fd5fd370372 100644 (file)
@@ -172,27 +172,51 @@ IsValidDeleteTarget(
   )\r
 {\r
   CONST CHAR16        *TempLocation;\r
-  CHAR16              *Temp2;\r
+  BOOLEAN             RetVal;\r
+  CHAR16              *SearchString;\r
+  CHAR16              *Pattern;\r
   UINTN               Size;\r
 \r
+  if (Node == NULL || Node->FullName == NULL) {\r
+    return (FALSE);\r
+  }\r
+\r
   TempLocation = StrStr(Node->FullName, L":");\r
-  if (StrLen(TempLocation) == 2) {\r
+  if (StrLen(TempLocation) <= 2) {\r
     //\r
     // Deleting the root directory is invalid.\r
     //\r
     return (FALSE);\r
   }\r
+\r
   TempLocation = ShellGetCurrentDir(NULL);\r
-  Size = 0;\r
-  Temp2 = NULL;\r
-  StrnCatGrow(&Temp2, &Size, TempLocation, 0);\r
-  if (StrStr(Temp2, Node->FullName) != NULL) {\r
-    FreePool(Temp2);\r
-    return (FALSE);\r
+  if (TempLocation == NULL) {\r
+    //\r
+    // No working directory is specified so whatever is left is ok.\r
+    //\r
+    return (TRUE);\r
   }\r
-  FreePool(Temp2);\r
 \r
-  return (TRUE);\r
+  Pattern       = NULL;\r
+  SearchString  = NULL;\r
+  Size          = 0;\r
+  Pattern       = StrnCatGrow(&Pattern     , NULL, TempLocation  , 0);\r
+  SearchString  = StrnCatGrow(&SearchString, &Size, Node->FullName, 0);\r
+  SearchString  = StrnCatGrow(&SearchString, &Size, L"*", 0);\r
+\r
+  if (Pattern == NULL || SearchString == NULL) {\r
+    RetVal = FALSE;\r
+  } else {\r
+    RetVal = TRUE;\r
+    if (gUnicodeCollation->MetaiMatch(gUnicodeCollation, Pattern, SearchString)) {\r
+      RetVal = FALSE;\r
+    }\r
+  }\r
+\r
+  SHELL_FREE_NON_NULL(Pattern     );\r
+  SHELL_FREE_NON_NULL(SearchString);\r
+\r
+  return (RetVal);\r
 }\r
 \r
 /**\r