audk/MdeModulePkg/Bus/Pci
Hao Wu 3778a4dfcd MdeModulePkg/IdeBusPei: Fix undefined behavior in signed left shift
In function ReadCapacity(), the following expression:
MediaInfo->LastBlock = (Data.LastLba3 << 24) |
  (Data.LastLba2 << 16) |
  (Data.LastLba1 << 8) |
  Data.LastLba0;

(There is also a similar case in this function.)

will involve undefined behavior in signed left shift operations.

Since Data.LastLbaX is of type UINT8, and MediaInfo->LastBlock is of type
UINTN. Therefore, Data.LastLbaX will be promoted to int (32 bits, signed)
first, and then perform the left shift operation.

According to the C11 spec, Section 6.5.7:
4 The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated
  bits are filled with zeros. If E1 has an unsigned type, the value
  of the result is E1 * 2^E2 , reduced modulo one more than the
  maximum value representable in the result type. If E1 has a signed
  type and nonnegative value, and E1 * 2^E2 is representable in the
  result type, then that is the resulting value; otherwise, the
  behavior is undefined.

So if bit 7 of Data.LastLba3 is 1, (Data.LastLba3 << 24) will be out of
the range within int type. The undefined behavior of the signed left shift
will lead to a potential of setting the high 32 bits of
MediaInfo->LastBlock to 1 during the cast from type int to type UINT64
for X64 builds.

This commit will add an explicit UINT32 type cast for Data.LastLba3 to
resolve this issue.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
2017-04-13 08:58:51 +08:00
..
EhciDxe MdeModulePkg: Refine casting expression result to bigger size 2017-03-06 14:33:20 +08:00
EhciPei MdeModulePkg/Ehci: don't clear port status bits during init 2016-12-02 08:58:23 +08:00
IdeBusPei MdeModulePkg/IdeBusPei: Fix undefined behavior in signed left shift 2017-04-13 08:58:51 +08:00
IncompatiblePciDeviceSupportDxe MdeModulePkg/IncompatiblePci: Use MAX_UINTN to match any IDs 2017-02-10 16:52:00 +08:00
NonDiscoverablePciDeviceDxe MdeModulePkg/NonDiscoverable: Compare SIZE_4GB with address type 2017-01-12 21:26:30 +08:00
NvmExpressDxe MdeModulePkg/NvmExpressDxe: Memory leak fix in async code flow 2017-03-21 10:01:44 +08:00
PciBusDxe MdeModulePkg: Refine casting expression result to bigger size 2017-03-06 14:33:20 +08:00
PciHostBridgeDxe MdeModulePkg/PciHostBridgeDxe: rebase to ARRAY_SIZE() 2016-10-27 11:10:55 +02:00
PciSioSerialDxe MdeModulePkg/PciSioSerialDxe: Use MAX_UINT8 instead of PCI_BAR_ALL 2017-02-10 16:52:00 +08:00
SataControllerDxe MdeModulePkg/StaControllerDxe: Fix coding style issue 2017-01-05 14:41:42 +08:00
SdMmcPciHcDxe MdeModulePkg/SdMmc: Add break to avoid dead loop when polling OCR Reg 2017-03-13 21:41:46 +08:00
SdMmcPciHcPei MdeModulePkg/SdMmc: Add EDKII SD/MMC stack 2016-03-30 11:27:41 +08:00
UfsPciHcDxe MdeModulePkg: Convert all .uni files to utf-8 2015-12-15 04:56:23 +00:00
UfsPciHcPei MdeModulePkg: Convert all .uni files to utf-8 2015-12-15 04:56:23 +00:00
UhciDxe MdeModulePkg/Bus: Fix typos in comments 2016-10-27 09:11:16 +08:00
UhciPei MdeModulePkg: Fix typos in comments and variables 2016-07-11 10:29:48 +08:00
XhciDxe MdeModulePkg: Refine casting expression result to bigger size 2017-03-06 14:33:20 +08:00
XhciPei MdeModulePkg/Xhci: Add 10ms delay before sending SendAddr cmd to dev 2016-11-24 12:44:50 +08:00