kernel/eka/memmodel/epoc/flexible/mcodeseg.cpp
branchRCL_3
changeset 256 c1f20ce4abcf
parent 31 56f325a607ea
child 257 3e88ff8f41d5
--- a/kernel/eka/memmodel/epoc/flexible/mcodeseg.cpp	Thu Aug 19 11:14:22 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mcodeseg.cpp	Tue Aug 31 16:34:26 2010 +0300
@@ -221,12 +221,17 @@
 	TInt exportDirSize = iRamInfo.iExportDirCount * sizeof(TLinAddr);
 	if(exportDirSize > 0 || (exportDirSize==0 && (iCodeSeg->iAttr&ECodeSegAttNmdExpData)) )
 		{
+		TLinAddr expDirLoad = iRamInfo.iExportDir - iRamInfo.iCodeRunAddr + iRamInfo.iCodeLoadAddr;
+		if (expDirLoad < iRamInfo.iCodeLoadAddr ||
+			expDirLoad + exportDirSize > iRamInfo.iCodeLoadAddr + iRamInfo.iCodeSize)
+			{// Invalid export section but the loader should have checked this.
+			return KErrCorrupt;
+			}
 		exportDirSize += sizeof(TLinAddr);
 		TLinAddr* expDir = (TLinAddr*)Kern::Alloc(exportDirSize);
 		if(!expDir)
 			return KErrNoMemory;
 		iCopyOfExportDir = expDir;
-		TLinAddr expDirLoad = iRamInfo.iExportDir-iRamInfo.iCodeRunAddr+iRamInfo.iCodeLoadAddr;
 		UNLOCK_USER_MEMORY();
 		memcpy(expDir,(TAny*)(expDirLoad-sizeof(TLinAddr)),exportDirSize);
 		LOCK_USER_MEMORY();