Hi, Lubo

The "continue" should be "break" in below code, otherwise the Count is not 
correct if there are more than 2 duplicate items in the variable. And please 
save the correct variable content back to the variable storage after duplicate 
items are removed.
> +     if (Buffer[Index].Bits.Vid == Buffer[Index2].Bits.Vid) {
> +       FoundDuplicateItem = TRUE;
> +       Count++;
> +       continue;
> +     }

Siyuan

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> Zhang Lubo
> Sent: Thursday, February 25, 2016 11:18 AM
> To: edk2-devel@lists.01.org
> Cc: Ye, Ting <ting...@intel.com>; Fu, Siyuan <siyuan...@intel.com>; Wu,
> Jiaxin <jiaxin...@intel.com>
> Subject: [edk2] [PATCH v2] MdeModulePkg:Fix a robustness issue of Mnp
> Driver
> 
> v2:
> *
> If the VLAN has duplicate items, try to delete it instead using VLAN
> Id 4095 which is a "reserved" tag number.
> 
> Duplicate items in VLAN variable will cause MNP driver binding
> start function fall into infinite loop,so we should check it's
> content before using it.
> 
> Cc: Fu Siyuan <siyuan...@intel.com>
> Cc: Ye Ting <ting...@intel.com>
> Cc: Wu Jiaxin <jiaxin...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Zhang Lubo <lubo.zh...@intel.com>
> ---
>  MdeModulePkg/Universal/Network/MnpDxe/MnpVlan.c | 46
> +++++++++++++++++++++++--
>  1 file changed, 44 insertions(+), 2 deletions(-)
> 
> diff --git a/MdeModulePkg/Universal/Network/MnpDxe/MnpVlan.c
> b/MdeModulePkg/Universal/Network/MnpDxe/MnpVlan.c
> index 6e14c1f..7000e2e 100644
> --- a/MdeModulePkg/Universal/Network/MnpDxe/MnpVlan.c
> +++ b/MdeModulePkg/Universal/Network/MnpDxe/MnpVlan.c
> @@ -228,10 +228,51 @@ MnpInsertVlanTag (
>    VlanTci->Bits.Cfi      = VLAN_TCI_CFI_CANONICAL_MAC;
>    VlanTci->Bits.Priority = MnpServiceData->Priority;
>    VlanTci->Uint16        = HTONS (VlanTci->Uint16);
>  }
> 
> +/**
> +  Check VLAN configuration variable and delete the duplicative content if
> has identical Vlan ID.
> +
> +  @param[in]      Buffer             Pointer to the buffer contains the 
> array of
> VLAN_TCI.
> +  @param[in]      NumberOfVlan       Pointer to number of VLAN.
> +  @param[out]     NewNumberOfVlan    Pointer to number of unique VLAN.
> +
> +**/
> +VOID
> +MnpCheckVlanVariable (
> +  IN     VLAN_TCI          *Buffer,
> +  IN     UINTN             NumberOfVlan,
> +     OUT UINTN             *NewNumberOfVlan
> +  )
> +{
> +  UINTN             Index;
> +  UINTN             Index2;
> +  UINTN             Count;
> +  BOOLEAN           FoundDuplicateItem;
> +
> +  Count = 0;
> +  FoundDuplicateItem  = FALSE;
> +
> +  for (Index = 0; Index < NumberOfVlan; Index++) {
> +   for (Index2 = Index + 1; Index2 < NumberOfVlan; Index2++) {
> +     if (Buffer[Index].Bits.Vid == Buffer[Index2].Bits.Vid) {
> +       FoundDuplicateItem = TRUE;
> +       Count++;
> +       continue;
> +     }
> +   }
> +   if (FoundDuplicateItem) {
> +    for (Index2 = Index +1; Index2 < NumberOfVlan; Index++, Index2++) {
> +      CopyMem (Buffer + Index, Buffer + Index2, sizeof (VLAN_TCI));
> +    }
> +   }
> +   FoundDuplicateItem = FALSE;
> +  }
> +
> +  *NewNumberOfVlan = NumberOfVlan - Count;
> +}
> 
>  /**
>    Get VLAN configuration variable.
> 
>    @param[in]       MnpDeviceData      Pointer to the MNP device context data.
> @@ -253,10 +294,11 @@ MnpGetVlanVariable (
>    )
>  {
>    UINTN       BufferSize;
>    EFI_STATUS  Status;
>    VLAN_TCI    *Buffer;
> +  UINTN       NewNumberOfVlan;
> 
>    //
>    // Get VLAN configuration from EFI Variable
>    //
>    Buffer = NULL;
> @@ -290,17 +332,17 @@ MnpGetVlanVariable (
>    if (EFI_ERROR (Status)) {
>      FreePool (Buffer);
>      return Status;
>    }
> 
> -  *NumberOfVlan = BufferSize / sizeof (VLAN_TCI);
> +  MnpCheckVlanVariable (Buffer, BufferSize / sizeof (VLAN_TCI),
> &NewNumberOfVlan);
> +  *NumberOfVlan = NewNumberOfVlan;
>    *VlanVariable = Buffer;
> 
>    return Status;
>  }
> 
> -
>  /**
>    Set VLAN configuration variable.
> 
>    @param[in] MnpDeviceData       Pointer to the MNP device context data.
>    @param[in] NumberOfVlan        Number of VLAN in array VlanVariable.
> --
> 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