Good discovery.

Reviewed-by: Feng Tian <[email protected]>

-----Original Message-----
From: Wu, Hao A 
Sent: Friday, August 28, 2015 1:16 PM
To: [email protected]; Tian, Feng; Gao, Liming
Cc: Wu, Hao A
Subject: RE: [edk2] [PATCH v3 2/2] MdePkg UefiDevicePathLib: Fix possible 
memory read/write cross boundary

I've discovered that:
AsciiStrnCpyS (
  (CHAR8 *)SSId,
  sizeof (SSId) / sizeof (SSId[0]),
  (CHAR8 *)WiFi->SSId,
  sizeof (SSId) / sizeof (SSId[0]) - 1
  );
in DevicePathToText.c will cause a 1-byte memory read cross boundary in 
function AsciiStrnLenS(), when WiFi->SSId do not contain a NULL terminator.

Therefore, I replace the above code as below:
SSId[32] = '\0';
CopyMem (SSId, WiFi->SSId, 32);

Best Regards,
Hao Wu

> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of 
> Hao Wu
> Sent: Friday, August 28, 2015 11:49 AM
> To: [email protected]; Tian, Feng; Gao, Liming
> Cc: Wu, Hao A
> Subject: [edk2] [PATCH v3 2/2] MdePkg UefiDevicePathLib: Fix possible 
> memory read/write cross boundary
> 
> The SSID field of a Wi-Fi device path node may not contain a NULL 
> termination.
> 
> Additonal handle is added to make sure no cross-boundary memory 
> read/write will occur.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Hao Wu <[email protected]>
> ---
>  MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c | 15
> ++++++++++++---
>  MdePkg/Library/UefiDevicePathLib/DevicePathToText.c   | 11 ++++++++++-
>  2 files changed, 22 insertions(+), 4 deletions(-)
> 
> diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> index 10ba6a4..abb2642 100644
> --- a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> +++ b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> @@ -2826,7 +2826,8 @@ DevPathFromTextWiFi (
>    )
>  {
>    CHAR16                *SSIdStr;
> -  CHAR8                 *AsciiStr;
> +  CHAR8                 AsciiStr[33];
> +  UINTN                 DataLen;
>    WIFI_DEVICE_PATH      *WiFiDp;
> 
>    SSIdStr = GetNextParamStr (&TextDeviceNode); @@ -2836,8 +2837,16 @@ 
> DevPathFromTextWiFi (
>                                     (UINT16) sizeof (WIFI_DEVICE_PATH)
>                                     );
> 
> -  AsciiStr = (CHAR8 *) WiFiDp->SSId;
> -  StrToAscii (SSIdStr, &AsciiStr);
> +  if (NULL != SSIdStr) {
> +    DataLen = StrLen (SSIdStr);
> +    if (StrLen (SSIdStr) > 32) {
> +      SSIdStr[32] = L'\0';
> +      DataLen     = 32;
> +    }
> +
> +    UnicodeStrToAsciiStr (SSIdStr, AsciiStr);
> +    CopyMem (WiFiDp->SSId, AsciiStr, DataLen);  }
> 
>    return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;  } diff --git 
> a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> index 20d8812..abf4dfb 100644
> --- a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> +++ b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> @@ -1616,9 +1616,18 @@ DevPathToTextWiFi (
>    )
>  {
>    WIFI_DEVICE_PATH      *WiFi;
> +  UINT8                 SSId[33];
> 
>    WiFi = DevPath;
> -  UefiDevicePathLibCatPrint (Str, L"Wi-Fi(%a)", WiFi->SSId);
> +
> +  AsciiStrnCpyS (
> +    (CHAR8 *)SSId,
> +    sizeof (SSId) / sizeof (SSId[0]),
> +    (CHAR8 *)WiFi->SSId,
> +    sizeof (SSId) / sizeof (SSId[0]) - 1
> +    );
> +
> +  UefiDevicePathLibCatPrint (Str, L"Wi-Fi(%a)", SSId);
>  }
> 
>  /**
> --
> 1.9.5.msysgit.0
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to