The Ifconfig command handler tries to return an EFI_STATUS when
the return type should be SHELL_STATUS.

Cc: Cohen, Eugene <eug...@hp.com>
Cc: Carsey, Jaben <jaben.car...@intel.com>
Cc: Ye Ting <ting...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiaxin Wu <jiaxin...@intel.com>
---
 .../UefiShellNetwork1CommandsLib/Ifconfig.c        | 102 ++++++++++++++-------
 1 file changed, 69 insertions(+), 33 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index e16d46a..fb6f575 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -421,11 +421,11 @@ IfConfigGetInterfaceInfo (
                   NULL,
                   &HandleNum,
                   &HandleBuffer
                  );
   if (EFI_ERROR (Status) || (HandleNum == 0)) {
-    return EFI_ABORTED;
+    return Status;
   }
 
   //
   // Enumerate all handles that installed with ip4 service binding protocol.
   //
@@ -585,15 +585,15 @@ ON_ERROR:
 /**
   The list process of the ifconfig command.
 
   @param[in]   IfList    The pointer of IfList(interface list).
 
-  @retval EFI_SUCCESS    The ifconfig command list processed successfully.
+  @retval SHELL_SUCCESS  The ifconfig command list processed successfully.
   @retval others         The ifconfig command list process failed.
 
 **/
-EFI_STATUS
+SHELL_STATUS
 IfConfigShowInterfaceInfo (
   IN LIST_ENTRY    *IfList
   )
 {
   LIST_ENTRY                   *Entry;
@@ -781,35 +781,37 @@ IfConfigShowInterfaceInfo (
     }
   }
   
   ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), 
gShellNetwork1HiiHandle);
 
-  return EFI_SUCCESS;
+  return SHELL_SUCCESS;
 }
 
 /**
   The clean process of the ifconfig command to clear interface info.
 
   @param[in]   IfList    The pointer of IfList(interface list).
 
-  @retval EFI_SUCCESS    The ifconfig command clean processed successfully.
+  @retval SHELL_SUCCESS  The ifconfig command clean processed successfully.
   @retval others         The ifconfig command clean process failed.
 
 **/
-EFI_STATUS
+SHELL_STATUS
 IfConfigClearInterfaceInfo (
   IN LIST_ENTRY    *IfList
   )
 {
-  EFI_STATUS                Status;
+  EFI_STATUS                Status;  
+  SHELL_STATUS              ShellStatus;
   LIST_ENTRY                *Entry;
   LIST_ENTRY                *Next;
   IFCONFIG_INTERFACE_CB     *IfCb;
   EFI_IP4_CONFIG2_POLICY    Policy;
 
   Policy = Ip4Config2PolicyDhcp;
   Status = EFI_SUCCESS;
+  ShellStatus = SHELL_SUCCESS;
 
   if (IsListEmpty (IfList)) {
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);
   }
 
@@ -823,37 +825,37 @@ IfConfigClearInterfaceInfo (
                             IfCb->IfCfg,
                             Ip4Config2DataTypePolicy,
                             sizeof (EFI_IP4_CONFIG2_POLICY),
                             &Policy
                             );
-
     if (EFI_ERROR (Status)) {
+      ShellStatus = SHELL_ACCESS_DENIED;
       break;
     }
   }
 
-  return Status;
+  return ShellStatus;
 }
 
 /**
   The set process of the ifconfig command.
 
   @param[in]   IfList    The pointer of IfList(interface list).
   @param[in]   VarArg    The pointer of ARG_LIST(Args with "-s" option).
 
-  @retval EFI_SUCCESS    The ifconfig command set processed successfully.
+  @retval SHELL_SUCCESS  The ifconfig command set processed successfully.
   @retval others         The ifconfig command set process failed.
 
 **/
-EFI_STATUS
+SHELL_STATUS
 IfConfigSetInterfaceInfo (
   IN LIST_ENTRY    *IfList,
   IN ARG_LIST      *VarArg
   )
 {
-
   EFI_STATUS                       Status;
+  SHELL_STATUS                     ShellStatus;
   IFCONFIG_INTERFACE_CB            *IfCb;
   VAR_CHECK_CODE                   CheckCode;
   EFI_EVENT                        TimeOutEvt;
   EFI_EVENT                        MappedEvt;
   BOOLEAN                          IsAddressOk;
@@ -870,18 +872,19 @@ IfConfigSetInterfaceInfo (
 
   Dns = NULL;
 
   if (IsListEmpty (IfList)) {
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);
-    return EFI_INVALID_PARAMETER;
+    return SHELL_INVALID_PARAMETER;
   }
   
   //
   // Make sure to set only one interface each time.
   //
   IfCb   = NET_LIST_USER_STRUCT (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, 
Link);
   Status = EFI_SUCCESS;
+  ShellStatus = SHELL_SUCCESS;
 
   //
   // Initialize check list mechanism.
   //
   CheckCode = IfConfigRetriveCheckListByName(
@@ -899,10 +902,11 @@ IfConfigSetInterfaceInfo (
                   NULL,
                   NULL,
                   &TimeOutEvt
                   );
   if (EFI_ERROR (Status)) {
+    ShellStatus = SHELL_ACCESS_DENIED;
     goto ON_EXIT;
   }
 
   Status = gBS->CreateEvent (
                   EVT_NOTIFY_SIGNAL,
@@ -910,10 +914,11 @@ IfConfigSetInterfaceInfo (
                   IfConfigManualAddressNotify,
                   &IsAddressOk,
                   &MappedEvt
                   );
   if (EFI_ERROR (Status)) {
+    ShellStatus = SHELL_ACCESS_DENIED;
     goto ON_EXIT;
   }
 
   //
   // Parse the setting variables.
@@ -967,10 +972,11 @@ IfConfigSetInterfaceInfo (
     //
     if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
       if (IfCb->Policy == Ip4Config2PolicyDhcp) {
         Status = IfConfigStartIp4 (IfCb->NicHandle, gImageHandle);
         if (EFI_ERROR(Status)) {
+          ShellStatus = SHELL_ACCESS_DENIED;
           goto ON_EXIT;
         }
       } else {
         //
         // Set dhcp config policy
@@ -981,10 +987,11 @@ IfConfigSetInterfaceInfo (
                                 Ip4Config2DataTypePolicy,
                                 sizeof (EFI_IP4_CONFIG2_POLICY),
                                 &Policy
                                 );
         if (EFI_ERROR(Status)) {
+          ShellStatus = SHELL_ACCESS_DENIED;
           goto ON_EXIT;
         }
       }
       
       VarArg= VarArg->Next;    
@@ -998,12 +1005,12 @@ IfConfigSetInterfaceInfo (
                               IfCb->IfCfg,
                               Ip4Config2DataTypePolicy,
                               sizeof (EFI_IP4_CONFIG2_POLICY),
                               &Policy
                               );
-
       if (EFI_ERROR(Status)) {
+        ShellStatus = SHELL_ACCESS_DENIED;
         goto ON_EXIT;
       }
 
       VarArg= VarArg->Next;   
 
@@ -1012,28 +1019,31 @@ IfConfigSetInterfaceInfo (
       //
       // Get manual IP address.
       //
       Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
       if (EFI_ERROR(Status)) {
+        ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
 
       //
       // Get subnetmask.
       //    
       VarArg = VarArg->Next;
       Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
       if (EFI_ERROR(Status)) {
+        ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
 
       //
       // Get gateway.
       //
       VarArg = VarArg->Next;
       Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
       if (EFI_ERROR(Status)) {
+        ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
       
       IsAddressOk = FALSE;
 
@@ -1041,10 +1051,11 @@ IfConfigSetInterfaceInfo (
                               IfCb->IfCfg,
                               Ip4Config2DataTypeManualAddress,
                               MappedEvt
                               );
       if (EFI_ERROR (Status)) {
+        ShellStatus = SHELL_ACCESS_DENIED;
         goto ON_EXIT;
       }
 
       DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);
 
@@ -1069,13 +1080,14 @@ IfConfigSetInterfaceInfo (
       IfCb->IfCfg->UnregisterDataNotify (
                      IfCb->IfCfg,
                      Ip4Config2DataTypeManualAddress,
                      MappedEvt
                      );
-
+      
       if (EFI_ERROR (Status)) {
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);
+        ShellStatus = SHELL_ACCESS_DENIED;
         goto ON_EXIT;
       }
 
       //
       // Set gateway.
@@ -1086,10 +1098,15 @@ IfConfigSetInterfaceInfo (
                               IfCb->IfCfg,
                               Ip4Config2DataTypeGateway,
                               DataSize,
                               &Gateway
                               );
+      if (EFI_ERROR (Status)) {
+        ShellStatus = SHELL_ACCESS_DENIED;
+        goto ON_EXIT;
+      }
+      
       VarArg = VarArg->Next;
       
     } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
       //
       // Get DNS addresses.
@@ -1107,10 +1124,11 @@ IfConfigSetInterfaceInfo (
       Tmp   = VarArg;
       Index = 0;
       while (Tmp != NULL) {
         Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
         if (EFI_ERROR(Status)) {
+          ShellStatus = SHELL_INVALID_PARAMETER;
           goto ON_EXIT;
         }
         Index ++;
         Tmp = Tmp->Next;
       }
@@ -1126,70 +1144,76 @@ IfConfigSetInterfaceInfo (
                               IfCb->IfCfg,
                               Ip4Config2DataTypeDnsServer,
                               DataSize,
                               Dns
                               );
+      if (EFI_ERROR (Status)) {
+        ShellStatus = SHELL_ACCESS_DENIED;
+        goto ON_EXIT;
+      }
     }
   }
 
 ON_EXIT:
   if (Dns != NULL) {
     FreePool (Dns);
   }
   
-  return Status;
+  return ShellStatus;
 
 }
 
 /**
   The ifconfig command main process.
 
   @param[in]   Private    The pointer of IFCONFIG_PRIVATE_DATA.
 
-  @retval EFI_SUCCESS    ifconfig command processed successfully.
+  @retval SHELL_SUCCESS  ifconfig command processed successfully.
   @retval others         The ifconfig command process failed.
 
 **/
-EFI_STATUS
+SHELL_STATUS
 IfConfig (
   IN IFCONFIG_PRIVATE_DATA    *Private
   )
 {
   EFI_STATUS    Status;
+  SHELL_STATUS  ShellStatus;
+
+  ShellStatus = SHELL_SUCCESS;
 
   //
   // Get configure information of all interfaces.
   //
   Status = IfConfigGetInterfaceInfo (
              Private->IfName,
              &Private->IfList
              );
-
   if (EFI_ERROR (Status)) {
+    ShellStatus = SHELL_NOT_FOUND; 
     goto ON_EXIT;
   }
 
   switch (Private->OpCode) {
   case IfConfigOpList:
-    Status = IfConfigShowInterfaceInfo (&Private->IfList);
+    ShellStatus = IfConfigShowInterfaceInfo (&Private->IfList);
     break;
 
   case IfConfigOpClear:
-    Status = IfConfigClearInterfaceInfo (&Private->IfList);
+    ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList);
     break;
 
   case IfConfigOpSet:
-    Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+    ShellStatus = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
     break;
 
   default:
-    Status = EFI_ABORTED;
+    ShellStatus = SHELL_UNSUPPORTED;
   }
 
 ON_EXIT:
-
-  return Status;
+  return ShellStatus;
 }
 
 /**
   The ifconfig command cleanup process, free the allocated memory.
 
@@ -1265,56 +1289,66 @@ ShellCommandRunIfconfig (
   )
 {
   EFI_STATUS                Status;
   IFCONFIG_PRIVATE_DATA     *Private;
   LIST_ENTRY                *ParamPackage;
+  SHELL_STATUS              ShellStatus;
   CONST CHAR16              *ValueStr;
   ARG_LIST                  *ArgList;
   CHAR16                    *ProblemParam;
   CHAR16                    *Str;
-
+  
+  Status = EFI_INVALID_PARAMETER;
   Private = NULL;
+  ShellStatus = SHELL_SUCCESS;
 
   Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, 
&ProblemParam, TRUE, FALSE);
   if (EFI_ERROR (Status)) {
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
+    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
+      FreePool(ProblemParam);
+      ShellStatus = SHELL_INVALID_PARAMETER;
+    } else {
+      ASSERT(FALSE);
+    }
+    
     goto ON_EXIT;
   }
 
   //
   // To handle unsupported option.
   //
   if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+    ShellStatus = SHELL_INVALID_PARAMETER;
     goto ON_EXIT;
   }
 
   //
   // To handle no option.
   //
   if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && 
!ShellCommandLineGetFlag (ParamPackage, L"-s") &&
       !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), 
gShellNetwork1HiiHandle);
+    ShellStatus = SHELL_INVALID_PARAMETER;
     goto ON_EXIT;
   }
 
   //
   // To handle conflict options.
   //
   if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
       ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
       ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-l")))) {
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), 
gShellNetwork1HiiHandle, L"ifconfig");
+    ShellStatus = SHELL_INVALID_PARAMETER;
     goto ON_EXIT;
   }
 
-  Status = EFI_INVALID_PARAMETER;
-
   Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
-
   if (Private == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
+    ShellStatus = SHELL_OUT_OF_RESOURCES;
     goto ON_EXIT;
   }
 
   InitializeListHead (&Private->IfList);
 
@@ -1349,10 +1383,11 @@ ShellCommandRunIfconfig (
   //
   if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {
     ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
     if (ValueStr == NULL) {
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle);
+      ShellStatus = SHELL_INVALID_PARAMETER;
       goto ON_EXIT;
     }
     
     //
     // To split the configuration into multi-section.
@@ -1365,24 +1400,25 @@ ShellCommandRunIfconfig (
 
     Private->VarArg = ArgList->Next;
 
     if (Private->IfName == NULL || Private->VarArg == NULL) {
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), 
gShellNetwork1HiiHandle);
+      ShellStatus = SHELL_INVALID_PARAMETER;
       goto ON_EXIT;
     }
   }
   
   //
   // Main process of ifconfig.
   //
-  Status = IfConfig (Private);
+  ShellStatus = IfConfig (Private);
 
 ON_EXIT:
 
   ShellCommandLineFreeVarList (ParamPackage);
   
   if (Private != NULL) {
     IfConfigCleanup (Private);
   }
 
-  return Status;
+  return ShellStatus;
 }
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to