]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel1CommandsLib/For.c
pointer verification (not NULL) and buffer overrun fixes.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel1CommandsLib / For.c
index 0e68119b8dd87451284debcc607fcb221ac38cd1..ddcfd45de381cbb375db39daf08babe2f56453c2 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for endfor and for shell level 1 functions.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
 #include "UefiShellLevel1CommandsLib.h"\r
 #include <Library/PrintLib.h>\r
 \r
+/**\r
+  Determine if a valid string is a valid number for the 'for' command.\r
+\r
+  @param[in] Number The pointer to the string representation of the number to test.\r
+\r
+  @retval TRUE    The number is valid.\r
+  @retval FALSE   The number is not valid.\r
+**/\r
 BOOLEAN\r
 EFIAPI\r
 ShellIsValidForNumber (\r
@@ -78,7 +86,17 @@ ShellCommandRunEndFor (
   Found = MoveToTag(GetPreviousNode, L"for", L"endfor", NULL, ShellCommandGetCurrentScriptFile(), FALSE, FALSE, FALSE);\r
 \r
   if (!Found) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"For", L"EndFor", ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+    ShellPrintHiiEx(\r
+      -1, \r
+      -1, \r
+      NULL, \r
+      STRING_TOKEN (STR_SYNTAX_NO_MATCHING), \r
+      gShellLevel1HiiHandle, \r
+      L"For", \r
+      L"EndFor", \r
+      ShellCommandGetCurrentScriptFile()!=NULL\r
+        &&ShellCommandGetCurrentScriptFile()->CurrentCommand!=NULL\r
+          ?ShellCommandGetCurrentScriptFile()->CurrentCommand->Line:0);\r
     return (SHELL_NOT_FOUND);\r
   }\r
   return (SHELL_SUCCESS);\r
@@ -103,8 +121,11 @@ typedef struct {
   @param[in] Alias              The alias to test for.\r
   @param[in] CommandString      The updated command string.\r
   @param[in,out] List           The list to search.\r
+\r
+  @retval EFI_SUCCESS           The operation was completed successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough free memory.\r
 **/\r
-VOID\r
+EFI_STATUS\r
 EFIAPI\r
 InternalUpdateAliasOnList(\r
   IN CONST CHAR16       *Alias,\r
@@ -139,12 +160,16 @@ InternalUpdateAliasOnList(
   }\r
   if (!Found) {\r
     Node = AllocateZeroPool(sizeof(ALIAS_LIST));\r
+    if (Node == NULL) {\r
+      return (EFI_OUT_OF_RESOURCES);\r
+    }\r
     ASSERT(Node->Alias == NULL);\r
     Node->Alias         = StrnCatGrow(&Node->Alias, NULL, Alias, 0);\r
     ASSERT(Node->CommandString == NULL);\r
     Node->CommandString = StrnCatGrow(&Node->CommandString, NULL, CommandString, 0);\r
     InsertTailList(List, &Node->Link);\r
   }\r
+  return (EFI_SUCCESS);\r
 }\r
 \r
 /**\r
@@ -290,7 +315,16 @@ ShellCommandRunFor (
     // Make sure that an End exists.\r
     //\r
     if (!MoveToTag(GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", L"For", ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+      ShellPrintHiiEx(\r
+        -1, \r
+        -1, \r
+        NULL, \r
+        STRING_TOKEN (STR_SYNTAX_NO_MATCHING), \r
+        gShellLevel1HiiHandle, \r
+        L"EndFor", \r
+        L"For", \r
+        CurrentScriptFile->CurrentCommand!=NULL\r
+          ?CurrentScriptFile->CurrentCommand->Line:0);\r
       return (SHELL_DEVICE_ERROR);\r
     }\r
 \r
@@ -301,7 +335,7 @@ ShellCommandRunFor (
       ||!((gEfiShellParametersProtocol->Argv[1][1] >= L'a' && gEfiShellParametersProtocol->Argv[1][1] <= L'z')\r
        ||(gEfiShellParametersProtocol->Argv[1][1] >= L'A' && gEfiShellParametersProtocol->Argv[1][1] <= L'Z'))\r
      ) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[2]);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[1]);\r
       return (SHELL_INVALID_PARAMETER);\r
     }\r
 \r
@@ -372,7 +406,7 @@ ShellCommandRunFor (
         if (ArgSet == NULL) {\r
 //        ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L"\"", 0);\r
         } else {\r
-          ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L"  ", 0);\r
+          ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L" ", 0);\r
         }\r
         ArgSet = StrnCatGrow(&ArgSet, &ArgSize, gEfiShellParametersProtocol->Argv[LoopVar], 0);\r
 //        ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L" ", 0);\r
@@ -390,49 +424,60 @@ ShellCommandRunFor (
         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
-        ArgSetWalker++;\r
-        while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
-          ArgSetWalker++;\r
+        TempSpot = StrStr(ArgSetWalker, L")");\r
+        if (TempSpot != NULL) {\r
+          TempString = TempSpot+1;\r
+          if (*(TempString) != CHAR_NULL) {\r
+            while(TempString != NULL && *TempString == L' ') {\r
+              TempString++;\r
+            }\r
+            if (StrLen(TempString) > 0) {\r
+              TempSpot = NULL;\r
+            }\r
+          }\r
         }\r
-        if (!ShellIsValidForNumber(ArgSetWalker)) {\r
+        if (TempSpot == NULL) {\r
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
-          if (ArgSetWalker[0] == L'-') {\r
-            Info->Current = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
-          } else {\r
-            Info->Current = (INTN)ShellStrToUintn(ArgSetWalker);\r
-          }\r
-          ArgSetWalker  = StrStr(ArgSetWalker, L" ");\r
+          *TempSpot = CHAR_NULL;\r
+          ArgSetWalker++;\r
           while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
             ArgSetWalker++;\r
           }\r
-          if (ArgSetWalker == NULL || *ArgSetWalker == CHAR_NULL || !ShellIsValidForNumber(ArgSetWalker)){\r
+          if (!ShellIsValidForNumber(ArgSetWalker)) {\r
             ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           } else {\r
             if (ArgSetWalker[0] == L'-') {\r
-              Info->End = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
+              Info->Current = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
             } else {\r
-              Info->End = (INTN)ShellStrToUintn(ArgSetWalker);\r
+              Info->Current = (INTN)ShellStrToUintn(ArgSetWalker);\r
             }\r
-            if (Info->Current < Info->End) {\r
-              Info->Step            = 1;\r
-            } else {\r
-              Info->Step            = -1;\r
-            }\r
-\r
             ArgSetWalker  = StrStr(ArgSetWalker, L" ");\r
             while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
               ArgSetWalker++;\r
             }\r
-            if (ArgSetWalker != NULL && *ArgSetWalker != CHAR_NULL) {\r
-              TempSpot = StrStr(ArgSetWalker, L")");\r
-              if (TempSpot == NULL) {\r
-                ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
-                ShellStatus = SHELL_INVALID_PARAMETER;\r
+            if (ArgSetWalker == NULL || *ArgSetWalker == CHAR_NULL || !ShellIsValidForNumber(ArgSetWalker)){\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+              ShellStatus = SHELL_INVALID_PARAMETER;\r
+            } else {\r
+              if (ArgSetWalker[0] == L'-') {\r
+                Info->End = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
               } else {\r
-                *TempSpot = CHAR_NULL;\r
+                Info->End = (INTN)ShellStrToUintn(ArgSetWalker);\r
+              }\r
+              if (Info->Current < Info->End) {\r
+                Info->Step            = 1;\r
+              } else {\r
+                Info->Step            = -1;\r
+              }\r
+\r
+              ArgSetWalker  = StrStr(ArgSetWalker, L" ");\r
+              while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
+                ArgSetWalker++;\r
+              }\r
+              if (ArgSetWalker != NULL && *ArgSetWalker != CHAR_NULL) {\r
                 if (ArgSetWalker == NULL || *ArgSetWalker == CHAR_NULL || !ShellIsValidForNumber(ArgSetWalker)){\r
                   ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
                   ShellStatus = SHELL_INVALID_PARAMETER;\r
@@ -445,8 +490,14 @@ ShellCommandRunFor (
                     } else {\r
                       Info->Step = (INTN)ShellStrToUintn(ArgSetWalker);\r
                     }\r
+\r
+                    if (StrStr(ArgSetWalker, L" ") != NULL) {\r
+                      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+                      ShellStatus = SHELL_INVALID_PARAMETER;\r
+                    }\r
                   }\r
                 }\r
+                \r
               }\r
             }\r
           }\r
@@ -522,9 +573,9 @@ ShellCommandRunFor (
         if (Info->CurrentValue[0] == L'\"') {\r
           Info->CurrentValue++;\r
         }\r
-        while (Info->CurrentValue[0] == L' ') {\r
-          Info->CurrentValue++;\r
-        }\r
+//        while (Info->CurrentValue[0] == L' ') {\r
+//          Info->CurrentValue++;\r
+//        }\r
         if (Info->CurrentValue[0] == L'\"') {\r
           Info->CurrentValue++;\r
         }\r