Reviewed-by: Jaben Carsey <jaben.car...@intel.com>

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> Jiaxin Wu
> Sent: Wednesday, December 02, 2015 12:54 AM
> To: edk2-devel@lists.01.org
> Cc: Carsey, Jaben <jaben.car...@intel.com>; Ye, Ting <ting...@intel.com>;
> Cohen, Eugene <eug...@hp.com>
> Subject: [edk2] [Patch] ShellPkg: Fix wrong return status for Ifconfig.c
> Importance: High
> 
> 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
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to