From ee37e305bda6a5f83569a7b202b73df4d00151f1 Mon Sep 17 00:00:00 2001 From: Savva Mitrofanov Date: Fri, 7 Mar 2025 15:47:24 +0300 Subject: [PATCH] NetworkPkg/DxeNetLib: Fix unaligned access in NetblockChecksum Into this routine the caller passes different data structures with different alignment that is why casting bulk pointer to UINT16 violates strict aliasing rule. --- NetworkPkg/Library/DxeNetLib/NetBuffer.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/NetworkPkg/Library/DxeNetLib/NetBuffer.c b/NetworkPkg/Library/DxeNetLib/NetBuffer.c index 4721fbd270..ec22708c0e 100644 --- a/NetworkPkg/Library/DxeNetLib/NetBuffer.c +++ b/NetworkPkg/Library/DxeNetLib/NetBuffer.c @@ -1618,20 +1618,12 @@ NetblockChecksum ( ) { register UINT32 Sum; + UINT32 BulkPtr; Sum = 0; - // - // Add left-over byte, if any - // - if (Len % 2 != 0) { - Sum += *(Bulk + Len - 1); - } - - while (Len > 1) { - Sum += *(UINT16 *)Bulk; - Bulk += 2; - Len -= 2; + for (BulkPtr = 0; BulkPtr < Len; BulkPtr++, Bulk++) { + Sum += ((*Bulk) << ((BulkPtr & 1U) * 8U)); } //