X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=ShellPkg%2FLibrary%2FUefiShellNetwork1CommandsLib%2FIfconfig.c;h=cdc6db69c34e0372b18ee74e98eb907f12990679;hp=df19a9f90240a20d6f39ef0238d1aa2b327640bb;hb=4b2dc555d8a67e715d8fafab4c9131791d31a788;hpb=41a55ffe795c7507def0dbe61ae87c9633c13833 diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c index df19a9f902..cdc6db69c3 100644 --- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c +++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c @@ -2,7 +2,7 @@ The implementation for Shell command ifconfig based on IP4Config2 protocol. (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
- Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -45,7 +45,7 @@ typedef struct _IFCONFIG_INTERFACE_CB { EFI_HANDLE NicHandle; LIST_ENTRY Link; EFI_IP4_CONFIG2_PROTOCOL *IfCfg; - EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo; + EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo; EFI_IP4_CONFIG2_POLICY Policy; UINT32 DnsCnt; EFI_IPv4_ADDRESS DnsAddr[1]; @@ -129,6 +129,26 @@ VAR_CHECK_ITEM mSetCheckList[] = { STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT"; +/** + Free the ARG_LIST. + + @param List Pointer to ARG_LIST to free. +**/ +VOID +FreeArgList ( + ARG_LIST *List +) +{ + ARG_LIST *Next; + while (List->Next != NULL) { + Next = List->Next; + FreePool (List); + List = Next; + } + + FreePool (List); +} + /** Split a string with specified separator and save the substring to a list. @@ -157,14 +177,18 @@ SplitStrToList ( // Copy the CONST string to a local copy. // Str = AllocateCopyPool (StrSize (String), String); - ASSERT (Str != NULL); + if (Str == NULL) { + return NULL; + } ArgStr = Str; // // init a node for the list head. // ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST)); - ASSERT (ArgNode != NULL); + if (ArgNode == NULL) { + return NULL; + } ArgList = ArgNode; // @@ -176,7 +200,14 @@ SplitStrToList ( ArgNode->Arg = ArgStr; ArgStr = Str + 1; ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST)); - ASSERT (ArgNode->Next != NULL); + if (ArgNode->Next == NULL) { + // + // Free the local copy of string stored in the first node + // + FreePool (ArgList->Arg); + FreeArgList (ArgList); + return NULL; + } ArgNode = ArgNode->Next; } @@ -273,7 +304,6 @@ IfConfigManualAddressNotify ( *((BOOLEAN *) Context) = TRUE; } - /** Print MAC address. @@ -344,7 +374,7 @@ IfConfigGetInterfaceInfo ( &HandleBuffer ); if (EFI_ERROR (Status) || (HandleNum == 0)) { - return EFI_ABORTED; + return Status; } // @@ -369,7 +399,7 @@ IfConfigGetInterfaceInfo ( if (EFI_ERROR (Status)) { goto ON_ERROR; } - + // // Get the interface information size. // @@ -390,7 +420,7 @@ IfConfigGetInterfaceInfo ( Status = EFI_OUT_OF_RESOURCES; goto ON_ERROR; } - + // // Get the interface info. // @@ -404,7 +434,7 @@ IfConfigGetInterfaceInfo ( if (EFI_ERROR (Status)) { goto ON_ERROR; } - + // // Check the interface name if required. // @@ -414,7 +444,7 @@ IfConfigGetInterfaceInfo ( } DataSize = 0; - + // // Get the size of dns server list. // @@ -508,20 +538,23 @@ ON_ERROR: @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; - LIST_ENTRY *Next; - IFCONFIG_INTERFACE_CB *IfCb; - EFI_IPv4_ADDRESS Gateway; - UINT32 Index; + LIST_ENTRY *Entry; + LIST_ENTRY *Next; + IFCONFIG_INTERFACE_CB *IfCb; + EFI_STATUS MediaStatus; + EFI_IPv4_ADDRESS Gateway; + UINT32 Index; + + MediaStatus = EFI_SUCCESS; if (IsListEmpty (IfList)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); @@ -540,6 +573,19 @@ IfConfigShowInterfaceInfo ( // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name); + // + // Get Media State. + // + if (EFI_SUCCESS == NetLibDetectMediaWaitTimeout (IfCb->NicHandle, 0, &MediaStatus)) { + if (MediaStatus != EFI_SUCCESS) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected"); + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present"); + } + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media state unknown"); + } + // // Print interface config policy. // @@ -565,10 +611,10 @@ IfConfigShowInterfaceInfo ( ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle); ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), + STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->IfInfo->StationAddress.Addr[0], (UINTN)IfCb->IfInfo->StationAddress.Addr[1], @@ -582,10 +628,10 @@ IfConfigShowInterfaceInfo ( ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle); ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), + STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->IfInfo->SubnetMask.Addr[0], (UINTN)IfCb->IfInfo->SubnetMask.Addr[1], @@ -599,26 +645,26 @@ IfConfigShowInterfaceInfo ( ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle); ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS)); - + for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) { if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) && (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS)); } - } + } ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), + STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)Gateway.Addr[0], (UINTN)Gateway.Addr[1], (UINTN)Gateway.Addr[2], (UINTN)Gateway.Addr[3] ); - + // // Print route table entry. // @@ -628,11 +674,11 @@ IfConfigShowInterfaceInfo ( ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index); ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), - gShellNetwork1HiiHandle, + STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), + gShellNetwork1HiiHandle, L"Subnet ", (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1], @@ -641,11 +687,11 @@ IfConfigShowInterfaceInfo ( ); ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), - gShellNetwork1HiiHandle, + STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), + gShellNetwork1HiiHandle, L"Netmask", (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0], (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1], @@ -654,11 +700,11 @@ IfConfigShowInterfaceInfo ( ); ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), - gShellNetwork1HiiHandle, + STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), + gShellNetwork1HiiHandle, L"Gateway", (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0], (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1], @@ -674,10 +720,10 @@ IfConfigShowInterfaceInfo ( for (Index = 0; Index < IfCb->DnsCnt; Index++) { ShellPrintHiiEx( - -1, - -1, + -1, + -1, NULL, - STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), + STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN) IfCb->DnsAddr[Index].Addr[0], (UINTN) IfCb->DnsAddr[Index].Addr[1], @@ -688,34 +734,37 @@ IfConfigShowInterfaceInfo ( ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); } } - + 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). + @param[in] IfName The pointer of interface name. - @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 + IN LIST_ENTRY *IfList, + IN CHAR16 *IfName ) { 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); @@ -723,23 +772,44 @@ IfConfigClearInterfaceInfo ( // // Go through the interface list. + // If the interface name is specified, DHCP DORA process will be + // triggered by the policy transition (static -> dhcp). // NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) { IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link); - + + if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) { + 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; + break; + } + } + + Policy = Ip4Config2PolicyDhcp; + 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; break; } } - return Status; + return ShellStatus; } /** @@ -748,18 +818,18 @@ IfConfigClearInterfaceInfo ( @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; @@ -770,6 +840,8 @@ IfConfigSetInterfaceInfo ( EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress; UINTN DataSize; EFI_IPv4_ADDRESS Gateway; + IP4_ADDR SubnetMask; + IP4_ADDR TempGateway; EFI_IPv4_ADDRESS *Dns; ARG_LIST *Tmp; UINTN Index; @@ -780,14 +852,15 @@ IfConfigSetInterfaceInfo ( 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. @@ -809,6 +882,8 @@ IfConfigSetInterfaceInfo ( &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; } @@ -820,6 +895,8 @@ IfConfigSetInterfaceInfo ( &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; } @@ -867,7 +944,7 @@ IfConfigSetInterfaceInfo ( } VarArg = VarArg->Next; - continue; + continue; } // @@ -884,47 +961,48 @@ IfConfigSetInterfaceInfo ( 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; + 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)) { + 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; } @@ -932,11 +1010,54 @@ IfConfigSetInterfaceInfo ( // 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; } - + + // + // Need to check the gateway validity before set Manual Address. + // In case we can set manual address but fail to configure Gateway. + // + CopyMem (&SubnetMask, &ManualAddress.SubnetMask, sizeof (IP4_ADDR)); + CopyMem (&TempGateway, &Gateway, sizeof (IP4_ADDR)); + SubnetMask = NTOHL (SubnetMask); + TempGateway = NTOHL (TempGateway); + if ((SubnetMask != 0) && + (SubnetMask != 0xFFFFFFFFu) && + !NetIp4IsUnicast (TempGateway, SubnetMask)) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), 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 ( @@ -945,6 +1066,8 @@ IfConfigSetInterfaceInfo ( 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; } @@ -976,6 +1099,7 @@ IfConfigSetInterfaceInfo ( if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); + ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -990,8 +1114,14 @@ IfConfigSetInterfaceInfo ( 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; - + } else if (StrCmp (VarArg->Arg, L"dns") == 0) { // // Get DNS addresses. @@ -1005,18 +1135,24 @@ IfConfigSetInterfaceInfo ( } Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS)); - ASSERT(Dns != NULL); + if (Dns == NULL) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellStatus = SHELL_OUT_OF_RESOURCES; + goto ON_EXIT; + } 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; } - + VarArg = Tmp; // @@ -1030,6 +1166,11 @@ IfConfigSetInterfaceInfo ( 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; + } } } @@ -1037,8 +1178,8 @@ ON_EXIT: if (Dns != NULL) { FreePool (Dns); } - - return EFI_SUCCESS; + + return ShellStatus; } @@ -1047,16 +1188,19 @@ ON_EXIT: @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. @@ -1065,31 +1209,30 @@ IfConfig ( 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, Private->IfName); 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; } /** @@ -1106,8 +1249,6 @@ IfConfigCleanup ( LIST_ENTRY *Entry; LIST_ENTRY *NextEntry; IFCONFIG_INTERFACE_CB *IfCb; - ARG_LIST *ArgNode; - ARG_LIST *ArgHead; ASSERT (Private != NULL); @@ -1115,15 +1256,7 @@ IfConfigCleanup ( // Clean the list which save the set config Args. // if (Private->VarArg != NULL) { - ArgHead = Private->VarArg; - - while (ArgHead->Next != NULL) { - ArgNode = ArgHead->Next; - FreePool (ArgHead); - ArgHead = ArgNode; - } - - FreePool (ArgHead); + FreeArgList (Private->VarArg); } if (Private->IfName != NULL) { @@ -1157,7 +1290,7 @@ IfConfigCleanup ( @retval EFI_SUCCESS ifconfig command processed successfully. @retval others The ifconfig command process failed. - + **/ SHELL_STATUS EFIAPI @@ -1169,16 +1302,26 @@ 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; } @@ -1187,6 +1330,7 @@ ShellCommandRunIfconfig ( // 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; } @@ -1196,6 +1340,7 @@ ShellCommandRunIfconfig ( 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; } @@ -1206,15 +1351,13 @@ ShellCommandRunIfconfig ( ((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; } @@ -1228,11 +1371,15 @@ ShellCommandRunIfconfig ( ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l"); if (ValueStr != NULL) { Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); - ASSERT (Str != NULL); + if (Str == NULL) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellStatus = SHELL_OUT_OF_RESOURCES; + goto ON_EXIT; + } Private->IfName = Str; } } - + // // To get interface name for the clear option. // @@ -1241,11 +1388,15 @@ ShellCommandRunIfconfig ( ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r"); if (ValueStr != NULL) { Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); - ASSERT (Str != NULL); + if (Str == NULL) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellStatus = SHELL_OUT_OF_RESOURCES; + goto ON_EXIT; + } Private->IfName = Str; } } - + // // To get interface name and corresponding Args for the set option. // @@ -1253,14 +1404,19 @@ ShellCommandRunIfconfig ( 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. // - ArgList = SplitStrToList (ValueStr, L' '); - ASSERT (ArgList != NULL); + ArgList = SplitStrToList (ValueStr, L' '); + if (ArgList == NULL) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellStatus = SHELL_OUT_OF_RESOURCES; + goto ON_EXIT; + } Private->OpCode = IfConfigOpSet; Private->IfName = ArgList->Arg; @@ -1269,22 +1425,23 @@ ShellCommandRunIfconfig ( 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; }