GenFw: PeCoffConvertImageToXip overwrites file headers
authorjljusten <jljusten@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 22 Dec 2009 07:28:32 +0000 (07:28 +0000)
committerjljusten <jljusten@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 22 Dec 2009 07:28:32 +0000 (07:28 +0000)
If a section had an offset which overlapped with the executable headers
then the headers would be overwritten by PeCoffConvertImageToXip.
Now, this function will abort the conversion to XIP if this situation
is detected.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1776 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFw/GenFw.c

index 0b0f83d..aabd143 100644 (file)
@@ -1449,6 +1449,16 @@ PeCoffConvertImageToXip (
     }\r
   }\r
 \r
+  if (FirstSectionOffset < PeHdr->Pe32.OptionalHeader.SizeOfHeaders) {\r
+    //\r
+    // If one of the sections should be loaded to an offset overlapping with\r
+    // the executable header, then it cannot be made into an XIP image.\r
+    //\r
+    VerboseMsg ("PE/COFF conversion to XIP is impossible due to overlap");\r
+    VerboseMsg ("of section data with the executable header.");\r
+    return;\r
+  }\r
+\r
   if (FirstSectionOffset == *FileLength) {\r
     //\r
     // If we never found a section with a non-zero size, then we\r
@@ -1482,9 +1492,9 @@ PeCoffConvertImageToXip (
   memset (XipFile, 0, XipLength);\r
 \r
   //\r
-  // Copy all the headers over (anything before the first section data)\r
+  // Copy the file headers\r
   //\r
-  memcpy (XipFile, *FileBuffer, FirstSectionOffset);\r
+  memcpy (XipFile, *FileBuffer, PeHdr->Pe32.OptionalHeader.SizeOfHeaders);\r
 \r
   NewPeHdr = GetPeCoffHeader ((void *)XipFile);\r
   if (NewPeHdr == NULL) {\r