]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhance the check for resource section data.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 26 Nov 2012 02:17:21 +0000 (02:17 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 26 Nov 2012 02:17:21 +0000 (02:17 +0000)
Signed-off-by: Dong Eric <eric.dong@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13962 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Library/BasePeCoffLib/BasePeCoff.c

index 27b130d42ecae25ee63555d393c9458b309be5e9..f82ed76ee6ced88313d487e49ca9026178c81a19 100644 (file)
@@ -1111,6 +1111,7 @@ PeCoffLoaderLoadImage (
   EFI_IMAGE_RESOURCE_DIRECTORY_STRING   *ResourceDirectoryString;\r
   EFI_IMAGE_RESOURCE_DATA_ENTRY         *ResourceDataEntry;\r
   CHAR16                                *String;\r
+  UINT32                                Offset;\r
 \r
 \r
   ASSERT (ImageContext != NULL);\r
@@ -1482,18 +1483,26 @@ PeCoffLoaderLoadImage (
       //\r
       // Use PE32 offset\r
       //\r
+      NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
       DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];\r
     } else {\r
       //\r
       // Use PE32+ offset\r
       //\r
+      NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
       DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];\r
     }\r
 \r
-    if (DirectoryEntry->Size != 0) {\r
+    if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE && DirectoryEntry->Size != 0) {\r
       Base = PeCoffLoaderImageAddress (ImageContext, DirectoryEntry->VirtualAddress);\r
       if (Base != NULL) {\r
         ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) Base;\r
+        Offset = sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * \r
+               (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
+        if (Offset > DirectoryEntry->Size) {\r
+          ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+          return RETURN_UNSUPPORTED;\r
+        }\r
         ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);\r
 \r
         for (Index = 0; Index < ResourceDirectory->NumberOfNamedEntries; Index++) {\r
@@ -1502,7 +1511,8 @@ PeCoffLoaderLoadImage (
             // Check the ResourceDirectoryEntry->u1.s.NameOffset before use it.\r
             //\r
             if (ResourceDirectoryEntry->u1.s.NameOffset >= DirectoryEntry->Size) {\r
-              continue;\r
+              ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+              return RETURN_UNSUPPORTED;\r
             }\r
             ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (Base + ResourceDirectoryEntry->u1.s.NameOffset);\r
             String = &ResourceDirectoryString->String[0];\r
@@ -1518,14 +1528,34 @@ PeCoffLoaderLoadImage (
                 //\r
                 // Move to next level - resource Name\r
                 //\r
+                if (ResourceDirectoryEntry->u2.s.OffsetToDirectory >= DirectoryEntry->Size) {\r
+                  ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+                  return RETURN_UNSUPPORTED;\r
+                }\r
                 ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);\r
+                Offset = ResourceDirectoryEntry->u2.s.OffsetToDirectory + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + \r
+                         sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
+                if (Offset > DirectoryEntry->Size) {\r
+                  ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+                  return RETURN_UNSUPPORTED;\r
+                }\r
                 ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);\r
 \r
                 if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {\r
                   //\r
                   // Move to next level - resource Language\r
                   //\r
+                  if (ResourceDirectoryEntry->u2.s.OffsetToDirectory >= DirectoryEntry->Size) {\r
+                    ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+                    return RETURN_UNSUPPORTED;\r
+                  }\r
                   ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);\r
+                  Offset = ResourceDirectoryEntry->u2.s.OffsetToDirectory + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + \r
+                           sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
+                  if (Offset > DirectoryEntry->Size) {\r
+                    ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+                    return RETURN_UNSUPPORTED;\r
+                  }\r
                   ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);\r
                 }\r
               }\r
@@ -1534,6 +1564,10 @@ PeCoffLoaderLoadImage (
               // Now it ought to be resource Data\r
               //\r
               if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) {\r
+                if (ResourceDirectoryEntry->u2.OffsetToData >= DirectoryEntry->Size) {\r
+                  ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+                  return RETURN_UNSUPPORTED;\r
+                }\r
                 ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (Base + ResourceDirectoryEntry->u2.OffsetToData);\r
                 ImageContext->HiiResourceData = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData);\r
                 break;\r