This patch is used to fix ifconfig hang issue with incomplete
parameters. In addition, some error related output information
is added to increase the interactivity.

Cc: Leekha Shaveta <shav...@freescale.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        |  61 ++++++++++++++++-----
 .../UefiShellNetwork1CommandsLib.uni               | Bin 21094 -> 21256 bytes
 2 files changed, 47 insertions(+), 14 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index fb6f575..f8dbc88 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -826,10 +826,11 @@ IfConfigClearInterfaceInfo (
                             Ip4Config2DataTypePolicy,
                             sizeof (EFI_IP4_CONFIG2_POLICY),
                             &Policy
                             );
     if (EFI_ERROR (Status)) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
       ShellStatus = SHELL_ACCESS_DENIED;
       break;
     }
   }
 
@@ -902,10 +903,11 @@ IfConfigSetInterfaceInfo (
                   NULL,
                   NULL,
                   &TimeOutEvt
                   );
   if (EFI_ERROR (Status)) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
     ShellStatus = SHELL_ACCESS_DENIED;
     goto ON_EXIT;
   }
 
   Status = gBS->CreateEvent (
@@ -914,10 +916,11 @@ IfConfigSetInterfaceInfo (
                   IfConfigManualAddressNotify,
                   &IsAddressOk,
                   &MappedEvt
                   );
   if (EFI_ERROR (Status)) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
     ShellStatus = SHELL_ACCESS_DENIED;
     goto ON_EXIT;
   }
 
   //
@@ -972,10 +975,11 @@ IfConfigSetInterfaceInfo (
     //
     if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
       if (IfCb->Policy == Ip4Config2PolicyDhcp) {
         Status = IfConfigStartIp4 (IfCb->NicHandle, gImageHandle);
         if (EFI_ERROR(Status)) {
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
           ShellStatus = SHELL_ACCESS_DENIED;
           goto ON_EXIT;
         }
       } else {
         //
@@ -987,74 +991,100 @@ IfConfigSetInterfaceInfo (
                                 Ip4Config2DataTypePolicy,
                                 sizeof (EFI_IP4_CONFIG2_POLICY),
                                 &Policy
                                 );
         if (EFI_ERROR(Status)) {
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
           ShellStatus = SHELL_ACCESS_DENIED;
           goto ON_EXIT;
         }
       }
       
       VarArg= VarArg->Next;    
 
     } else if (StrCmp (VarArg->Arg, L"static") == 0) {
-      //
-      // Set manual config policy.
-      //
-      Policy = Ip4Config2PolicyStatic;
-      Status = IfCb->IfCfg->SetData (
-                              IfCb->IfCfg,
-                              Ip4Config2DataTypePolicy,
-                              sizeof (EFI_IP4_CONFIG2_POLICY),
-                              &Policy
-                              );
-      if (EFI_ERROR(Status)) {
-        ShellStatus = SHELL_ACCESS_DENIED;
+      VarArg= VarArg->Next;
+      if (VarArg == NULL) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+        ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
 
-      VarArg= VarArg->Next;   
-
       ZeroMem (&ManualAddress, sizeof (ManualAddress));
     
       //
       // Get manual IP address.
       //
       Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
       if (EFI_ERROR(Status)) {
+        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);
         ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
 
       //
       // Get subnetmask.
       //    
       VarArg = VarArg->Next;
+      if (VarArg == NULL) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+        ShellStatus = SHELL_INVALID_PARAMETER;
+        goto ON_EXIT;
+      }
+      
       Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
       if (EFI_ERROR(Status)) {
+        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);
         ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
 
       //
       // Get gateway.
       //
       VarArg = VarArg->Next;
+      if (VarArg == NULL) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+        ShellStatus = SHELL_INVALID_PARAMETER;
+        goto ON_EXIT;
+      }
+      
       Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
       if (EFI_ERROR(Status)) {
+        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);
         ShellStatus = SHELL_INVALID_PARAMETER;
         goto ON_EXIT;
       }
+
+      //
+      // Set manual config policy.
+      //
+      Policy = Ip4Config2PolicyStatic;
+      Status = IfCb->IfCfg->SetData (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypePolicy,
+                              sizeof (EFI_IP4_CONFIG2_POLICY),
+                              &Policy
+                              );
+      if (EFI_ERROR(Status)) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
+        ShellStatus = SHELL_ACCESS_DENIED;
+        goto ON_EXIT;
+      }
       
+      //
+      // Set Manual Address.
+      //
       IsAddressOk = FALSE;
 
       Status = IfCb->IfCfg->RegisterDataNotify (
                               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;
       }
 
       DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);
@@ -1099,10 +1129,11 @@ IfConfigSetInterfaceInfo (
                               Ip4Config2DataTypeGateway,
                               DataSize,
                               &Gateway
                               );
       if (EFI_ERROR (Status)) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);
         ShellStatus = SHELL_ACCESS_DENIED;
         goto ON_EXIT;
       }
       
       VarArg = VarArg->Next;
@@ -1124,10 +1155,11 @@ IfConfigSetInterfaceInfo (
       Tmp   = VarArg;
       Index = 0;
       while (Tmp != NULL) {
         Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
         if (EFI_ERROR(Status)) {
+          ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg);
           ShellStatus = SHELL_INVALID_PARAMETER;
           goto ON_EXIT;
         }
         Index ++;
         Tmp = Tmp->Next;
@@ -1145,10 +1177,11 @@ IfConfigSetInterfaceInfo (
                               Ip4Config2DataTypeDnsServer,
                               DataSize,
                               Dns
                               );
       if (EFI_ERROR (Status)) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), 
gShellNetwork1HiiHandle, L"ifconfig");
         ShellStatus = SHELL_ACCESS_DENIED;
         goto ON_EXIT;
       }
     }
   }
diff --git 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index 
43259591820582cc38937ad680739fcff21b96c5..aa3a38a55fadd82f73d581f3678466db23af2645
 100644
GIT binary patch
delta 132
zcmaF1gt228<AxB$$qt$<ljkV#@dq$CGPnR?5Q8g2FhlU<kMfq2KPd=JPSO)&w3>X8
zLv*r>oYCeGMJ;AcH-<!pOokkWRE87=1%?uad>~m2<dp#FM4(s-LlKZy%uqZzQNeuj
c3{}3(PgHEwCNp{2OwRH?2ckDm^SQtZ0B9B^1poj5

delta 74
zcmeBJ#`tUr<AxB$&2maw%<P^FB@7A-X_Gxwr8gI;HmGqYGUNcE0z*DS(d3I>_LKE|
V&ar~UCL1b<Gebo;TlijJ1pqo#7J2{x

-- 
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