+/**\r
+ Perform bounds check on the common buffer.\r
+\r
+ @param [in] BufferAddr Address of the common buffer.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_ACCESS_DENIED Access not permitted.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+CheckBufferAddr (\r
+ IN UINTN BufferAddr\r
+ )\r
+{\r
+ UINT64 NsCommBufferEnd;\r
+ UINT64 SCommBufferEnd;\r
+ UINT64 CommBufferEnd;\r
+\r
+ NsCommBufferEnd = mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize;\r
+ SCommBufferEnd = mSCommBuffer.PhysicalStart + mSCommBuffer.PhysicalSize;\r
+\r
+ if ((BufferAddr >= mNsCommBuffer.PhysicalStart) &&\r
+ (BufferAddr < NsCommBufferEnd))\r
+ {\r
+ CommBufferEnd = NsCommBufferEnd;\r
+ } else if ((BufferAddr >= mSCommBuffer.PhysicalStart) &&\r
+ (BufferAddr < SCommBufferEnd))\r
+ {\r
+ CommBufferEnd = SCommBufferEnd;\r
+ } else {\r
+ return EFI_ACCESS_DENIED;\r
+ }\r
+\r
+ if ((CommBufferEnd - BufferAddr) < sizeof (EFI_MM_COMMUNICATE_HEADER)) {\r
+ return EFI_ACCESS_DENIED;\r
+ }\r
+\r
+ // perform bounds check.\r
+ if ((CommBufferEnd - BufferAddr - sizeof (EFI_MM_COMMUNICATE_HEADER)) <\r
+ ((EFI_MM_COMMUNICATE_HEADER *)BufferAddr)->MessageLength)\r
+ {\r
+ return EFI_ACCESS_DENIED;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r