SecurityPkg/DxeImageVerificationLib: extract SecDataDirEnd, SecDataDirLeft
The following two quantities: SecDataDir->VirtualAddress + SecDataDir->Size SecDataDir->VirtualAddress + SecDataDir->Size - OffSet are used multiple times in DxeImageVerificationHandler(). Introduce helper variables for them: "SecDataDirEnd" and "SecDataDirLeft", respectively. This saves us multiple calculations and significantly simplifies the code. Note that all three summands above have type UINT32, therefore the new variables are also of type UINT32. This patch does not change behavior. (Note that the code already handles the case when the SecDataDir->VirtualAddress + SecDataDir->Size UINT32 addition overflows -- namely, in that case, the certificate loop is never entered, and the corruption check right after the loop fires.) Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Min Xu <min.m.xu@intel.com> Cc: Wenyi Xie <xiewenyi2@huawei.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2215 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20200901091221.20948-2-lersek@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Wenyi Xie <xiewenyi2@huawei.com> Reviewed-by: Min M Xu <min.m.xu@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
		
				
					committed by
					
						![mergify[bot]](/avatar/e3df20cd7a67969c41a65f03bea54961?size=40) mergify[bot]
						mergify[bot]
					
				
			
			
				
	
			
			
			
						parent
						
							7513559926
						
					
				
				
					commit
					503248ccdf
				
			| @@ -1652,6 +1652,8 @@ DxeImageVerificationHandler ( | ||||
|   UINT8                                *AuthData; | ||||
|   UINTN                                AuthDataSize; | ||||
|   EFI_IMAGE_DATA_DIRECTORY             *SecDataDir; | ||||
|   UINT32                               SecDataDirEnd; | ||||
|   UINT32                               SecDataDirLeft; | ||||
|   UINT32                               OffSet; | ||||
|   CHAR16                               *NameStr; | ||||
|   RETURN_STATUS                        PeCoffStatus; | ||||
| @@ -1849,12 +1851,14 @@ DxeImageVerificationHandler ( | ||||
|   // "Attribute Certificate Table". | ||||
|   // The first certificate starts at offset (SecDataDir->VirtualAddress) from the start of the file. | ||||
|   // | ||||
|   SecDataDirEnd = SecDataDir->VirtualAddress + SecDataDir->Size; | ||||
|   for (OffSet = SecDataDir->VirtualAddress; | ||||
|        OffSet < (SecDataDir->VirtualAddress + SecDataDir->Size); | ||||
|        OffSet < SecDataDirEnd; | ||||
|        OffSet += (WinCertificate->dwLength + ALIGN_SIZE (WinCertificate->dwLength))) { | ||||
|     WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet); | ||||
|     if ((SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) <= sizeof (WIN_CERTIFICATE) || | ||||
|         (SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) < WinCertificate->dwLength) { | ||||
|     SecDataDirLeft = SecDataDirEnd - OffSet; | ||||
|     if (SecDataDirLeft <= sizeof (WIN_CERTIFICATE) || | ||||
|         SecDataDirLeft < WinCertificate->dwLength) { | ||||
|       break; | ||||
|     } | ||||
|  | ||||
| @@ -1948,7 +1952,7 @@ DxeImageVerificationHandler ( | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (OffSet != (SecDataDir->VirtualAddress + SecDataDir->Size)) { | ||||
|   if (OffSet != SecDataDirEnd) { | ||||
|     // | ||||
|     // The Size in Certificate Table or the attribute certificate table is corrupted. | ||||
|     // | ||||
|   | ||||
		Reference in New Issue
	
	Block a user