]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellNetwork2CommandsLib/Ifconfig6.c
ShellPkg/for: Fix potential null pointer deference
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork2CommandsLib / Ifconfig6.c
index 371b368d6dbbbf1e4a24918e12b1bd395dc43c65..377a163086cdda94e0559cb8e034e799a493e916 100644 (file)
@@ -2,6 +2,7 @@
   The implementation for Shell command IfConfig6.\r
 \r
   Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -154,6 +155,26 @@ VAR_CHECK_ITEM  mIfConfig6SetCheckList[] = {
   },\r
 };\r
 \r
+/**\r
+  Free the ARG_LIST.\r
+\r
+  @param List Pointer to ARG_LIST to free.\r
+**/\r
+VOID\r
+IfConfig6FreeArgList (\r
+  ARG_LIST       *List\r
+)\r
+{\r
+  ARG_LIST       *Next;\r
+  while (List->Next != NULL) {\r
+    Next = List->Next;\r
+    FreePool (List);\r
+    List = Next;\r
+  }\r
+\r
+  FreePool (List);\r
+}\r
+\r
 /**\r
   Split a string with specified separator and save the substring to a list.\r
 \r
@@ -181,15 +202,19 @@ IfConfig6SplitStrToList (
   //\r
   // Copy the CONST string to a local copy.\r
   //\r
-  Str     = AllocateCopyPool (StrSize (String), String);\r
-  ASSERT (Str != NULL);\r
+  Str = AllocateCopyPool (StrSize (String), String);\r
+  if (Str == NULL) {\r
+    return NULL;\r
+  }\r
   ArgStr  = Str;\r
 \r
   //\r
   // init a node for the list head.\r
   //\r
   ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
-  ASSERT (ArgNode != NULL);\r
+  if (ArgNode == NULL) {\r
+    return NULL;\r
+  }\r
   ArgList = ArgNode;\r
 \r
   //\r
@@ -201,7 +226,14 @@ IfConfig6SplitStrToList (
       ArgNode->Arg  = ArgStr;\r
       ArgStr        = Str + 1;\r
       ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
-      ASSERT (ArgNode->Next != NULL);\r
+      if (ArgNode->Next == NULL) {\r
+        //\r
+        // Free the local copy of string stored in the first node\r
+        //\r
+        FreePool (ArgList->Arg);\r
+        IfConfig6FreeArgList (ArgList);\r
+        return NULL;\r
+      }\r
       ArgNode = ArgNode->Next;\r
     }\r
 \r
@@ -1057,6 +1089,7 @@ IfConfig6ShowInterfaceInfo (
   }\r
 \r
   ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle);\r
+  ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
 \r
   return SHELL_SUCCESS;\r
 }\r
@@ -1065,6 +1098,7 @@ IfConfig6ShowInterfaceInfo (
   The clean process of the IfConfig6 application.\r
 \r
   @param[in]   IfList    The pointer of IfList(interface list).\r
+  @param[in]   IfName    The pointer of interface name.\r
 \r
   @retval SHELL_SUCCESS  The IfConfig6 clean processed successfully.\r
   @retval others         The IfConfig6 clean process failed.\r
@@ -1072,7 +1106,8 @@ IfConfig6ShowInterfaceInfo (
 **/\r
 SHELL_STATUS\r
 IfConfig6ClearInterfaceInfo (\r
-  IN LIST_ENTRY    *IfList\r
+  IN LIST_ENTRY    *IfList,\r
+  IN CHAR16        *IfName\r
   )\r
 {\r
   EFI_STATUS                Status;\r
@@ -1081,7 +1116,6 @@ IfConfig6ClearInterfaceInfo (
   IFCONFIG6_INTERFACE_CB    *IfCb;\r
   EFI_IP6_CONFIG_POLICY     Policy;\r
 \r
-  Policy = Ip6ConfigPolicyAutomatic;\r
   Entry  = IfList->ForwardLink;\r
   Status = EFI_SUCCESS;\r
   ShellStatus = SHELL_SUCCESS;\r
@@ -1091,12 +1125,31 @@ IfConfig6ClearInterfaceInfo (
   }\r
 \r
   //\r
-  // Go through the interface list.\r
+  // Go through the interface list.If the interface name is specified, then\r
+  // need to refresh the configuration.\r
   //\r
   while (Entry != IfList) {\r
 \r
     IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);\r
 \r
+    if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {\r
+      Policy = Ip6ConfigPolicyManual;\r
+\r
+      Status = IfCb->IfCfg->SetData (\r
+                              IfCb->IfCfg,\r
+                              Ip6ConfigDataTypePolicy,\r
+                              sizeof (EFI_IP6_CONFIG_POLICY),\r
+                              &Policy\r
+                              );\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");\r
+        ShellStatus = SHELL_ACCESS_DENIED;\r
+        break;\r
+      }\r
+    }\r
+\r
+    Policy = Ip6ConfigPolicyAutomatic;\r
+\r
     Status = IfCb->IfCfg->SetData (\r
                             IfCb->IfCfg,\r
                             Ip6ConfigDataTypePolicy,\r
@@ -1105,6 +1158,7 @@ IfConfig6ClearInterfaceInfo (
                             );\r
 \r
     if (EFI_ERROR (Status)) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");\r
       ShellStatus = SHELL_ACCESS_DENIED;\r
       break;\r
     }\r
@@ -1264,6 +1318,21 @@ IfConfig6SetInterfaceInfo (
 \r
       VarArg= VarArg->Next;\r
 \r
+      if (VarArg != NULL) {\r
+        if (StrCmp (VarArg->Arg, L"host") == 0) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_IP_CONFIG), gShellNetwork2HiiHandle, Status);\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          goto ON_EXIT;\r
+        } else if (StrCmp (VarArg->Arg, L"gw") == 0) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_GW_CONFIG), gShellNetwork2HiiHandle, Status);\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          goto ON_EXIT;\r
+        } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_DNS_CONFIG), gShellNetwork2HiiHandle, Status);\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          goto ON_EXIT;\r
+        }\r
+      }\r
     } else if (StrCmp (VarArg->Arg, L"man") == 0) {\r
       //\r
       // Set manual config policy.\r
@@ -1422,6 +1491,7 @@ IfConfig6SetInterfaceInfo (
             &CfgManAddr[Index].Address,\r
             &CfgManAddr[Index].PrefixLength\r
             );\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
         }\r
       }\r
 \r
@@ -1458,6 +1528,7 @@ IfConfig6SetInterfaceInfo (
 \r
       if (EFI_ERROR (Status)) {\r
         ShellStatus = SHELL_ACCESS_DENIED;\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_GW), gShellNetwork2HiiHandle, Status);\r
         goto ON_EXIT;\r
       }\r
 \r
@@ -1616,7 +1687,7 @@ IfConfig6 (
     break;\r
 \r
   case IfConfig6OpClear:\r
-    ShellStatus = IfConfig6ClearInterfaceInfo (&Private->IfList);\r
+    ShellStatus = IfConfig6ClearInterfaceInfo (&Private->IfList, Private->IfName);\r
     break;\r
 \r
   case IfConfig6OpSet:\r
@@ -1646,8 +1717,6 @@ IfConfig6Cleanup (
   LIST_ENTRY                *Entry;\r
   LIST_ENTRY                *NextEntry;\r
   IFCONFIG6_INTERFACE_CB    *IfCb;\r
-  ARG_LIST                  *ArgNode;\r
-  ARG_LIST                  *ArgHead;\r
 \r
   ASSERT (Private != NULL);\r
 \r
@@ -1655,15 +1724,7 @@ IfConfig6Cleanup (
   // Clean the list which save the set config Args.\r
   //\r
   if (Private->VarArg != NULL) {\r
-    ArgHead = Private->VarArg;\r
-\r
-    while (ArgHead->Next != NULL) {\r
-      ArgNode = ArgHead->Next;\r
-      FreePool (ArgHead);\r
-      ArgHead = ArgNode;\r
-    }\r
-\r
-    FreePool (ArgHead);\r
+    IfConfig6FreeArgList (Private->VarArg);\r
   }\r
 \r
   if (Private->IfName != NULL)\r
@@ -1777,8 +1838,12 @@ ShellCommandRunIfconfig6 (
     Private->OpCode = IfConfig6OpList;\r
     ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");\r
     if (ValueStr != NULL) {\r
-      Str             = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
-      ASSERT (Str != NULL);\r
+      Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
+      if (Str == NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
       Private->IfName = Str;\r
     }\r
   }\r
@@ -1789,8 +1854,12 @@ ShellCommandRunIfconfig6 (
     Private->OpCode = IfConfig6OpClear;\r
     ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");\r
     if (ValueStr != NULL) {\r
-      Str             = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
-      ASSERT (Str != NULL);\r
+      Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
+      if (Str == NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
       Private->IfName = Str;\r
     }\r
   }\r
@@ -1808,8 +1877,12 @@ ShellCommandRunIfconfig6 (
     //\r
     // To split the configuration into multi-section.\r
     //\r
-    ArgList         = IfConfig6SplitStrToList (ValueStr, L' ');\r
-    ASSERT (ArgList != NULL);\r
+    ArgList = IfConfig6SplitStrToList (ValueStr, L' ');\r
+    if (ArgList == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
+      ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+      goto ON_EXIT;\r
+    }\r
 \r
     Private->OpCode = IfConfig6OpSet;\r
     Private->IfName = ArgList->Arg;\r