summaryrefslogtreecommitdiff
path: root/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c')
-rw-r--r--jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c
index bce7945..6ca6bc2 100644
--- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c
+++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c
@@ -1100,6 +1100,7 @@ IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE hDeviceNode,
IMG_UINT8 *pDst;
PRESMAN_ITEM psResItem;
IMG_UINT32 ui32PDDevPAddrInDirListFormat;
+ IMG_UINT8 *pStartPDDevPAddr, *pEndPDDevPAddr;
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(SGX_HW_RENDER_CONTEXT_CLEANUP),
@@ -1135,6 +1136,16 @@ IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE hDeviceNode,
PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHWRenderContextKM: Couldn't allocate device memory for HW Render Context"));
goto exit1;
}
+ /* Ensure that the offset of Page directory dev physical address field is within the allocated context memory */
+ pStartPDDevPAddr = (IMG_UINT8 *)(psCleanup->psHWRenderContextMemInfo->pvLinAddrKM) + ui32OffsetToPDDevPAddr;
+ pEndPDDevPAddr = pStartPDDevPAddr + sizeof(ui32PDDevPAddrInDirListFormat) - 1;
+
+ if (pStartPDDevPAddr < (IMG_UINT8 *)psCleanup->psHWRenderContextMemInfo->pvLinAddrKM ||
+ pEndPDDevPAddr >= (IMG_UINT8 *)(psCleanup->psHWRenderContextMemInfo->pvLinAddrKM) + ui32HWRenderContextSize)
+ {
+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHWRenderContextKM: Offset of page directory device physical address is invalid"));
+ goto exit2;
+ }
eError = OSCopyFromUser(psPerProc,
psCleanup->psHWRenderContextMemInfo->pvLinAddrKM,
@@ -1287,6 +1298,7 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE hDeviceNode,
IMG_UINT8 *pDst;
PRESMAN_ITEM psResItem;
IMG_UINT32 ui32PDDevPAddrInDirListFormat;
+ IMG_UINT8 *pStartPDDevPAddr, *pEndPDDevPAddr;
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP),
@@ -1324,6 +1336,17 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE hDeviceNode,
goto exit1;
}
+ /* Ensure that the offset of Page directory dev physical address field is within the allocated context memory */
+ pStartPDDevPAddr = (IMG_UINT8 *)(psCleanup->psHWTransferContextMemInfo->pvLinAddrKM) + ui32OffsetToPDDevPAddr;
+ pEndPDDevPAddr = pStartPDDevPAddr + sizeof(ui32PDDevPAddrInDirListFormat) - 1;
+
+ if (pStartPDDevPAddr < (IMG_UINT8 *)psCleanup->psHWTransferContextMemInfo->pvLinAddrKM ||
+ pEndPDDevPAddr >= (IMG_UINT8 *)(psCleanup->psHWTransferContextMemInfo->pvLinAddrKM) + ui32HWTransferContextSize)
+ {
+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHWTransferContextKM: Offset of page directory device physical address is invalid"));
+ goto exit2;
+ }
+
eError = OSCopyFromUser(psPerProc,
psCleanup->psHWTransferContextMemInfo->pvLinAddrKM,
psHWTransferContextCpuVAddr,
@@ -1628,6 +1651,7 @@ IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE hDeviceNode,
IMG_UINT8 *pDst;
PRESMAN_ITEM psResItem;
IMG_UINT32 ui32PDDevPAddrInDirListFormat;
+ IMG_UINT8 *pStartPDDevPAddr, *pEndPDDevPAddr;
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(SGX_HW_2D_CONTEXT_CLEANUP),
@@ -1664,6 +1688,17 @@ IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE hDeviceNode,
goto exit1;
}
+ /* Ensure that the offset of Page directory dev physical address field is within the allocated context memory */
+ pStartPDDevPAddr = (IMG_UINT8 *)(psCleanup->psHW2DContextMemInfo->pvLinAddrKM) + ui32OffsetToPDDevPAddr;
+ pEndPDDevPAddr = pStartPDDevPAddr + sizeof(ui32PDDevPAddrInDirListFormat) - 1;
+
+ if (pStartPDDevPAddr < (IMG_UINT8 *)psCleanup->psHW2DContextMemInfo->pvLinAddrKM ||
+ pEndPDDevPAddr >= (IMG_UINT8 *)(psCleanup->psHW2DContextMemInfo->pvLinAddrKM) + ui32HW2DContextSize)
+ {
+ PVR_DPF((PVR_DBG_ERROR, "SGXRegisterHWTransferContextKM: Offset of page directory device physical address is invalid"));
+ goto exit2;
+ }
+
eError = OSCopyFromUser(psPerProc,
psCleanup->psHW2DContextMemInfo->pvLinAddrKM,
psHW2DContextCpuVAddr,