Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp	(revision 55905)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp	(revision 55906)
@@ -761,5 +761,4 @@
 
     rc = RTFileReadAt(File, 0, &aBuffer, sizeof(aBuffer), NULL);
-
     if (RT_FAILURE(rc))
         return rc;
@@ -777,6 +776,5 @@
         {
             const char* l_ppth = (char*)partitionTableHeader;
-            rc = strncmp(l_ppth, "EFI PART", 8);
-            if (RT_FAILURE(rc))
+            if (strncmp(l_ppth, "EFI PART", 8))
                 return VERR_INVALID_PARAMETER;
 
@@ -813,29 +811,36 @@
 
             uint32_t currentEntry = 0;
-            while(currentEntry<partitionsNumber)
-            {
-                uint8_t partitionEntry[128];
-
-                /*partition entries begin from LBA2*/
-                rc = RTFileReadAt(File, 1024 + currentEntry*partitionEntrySize, &partitionEntry, partitionEntrySize, NULL);
-
-                uint64_t start = RT_MAKE_U64_FROM_U8( partitionEntry[32],
-                                                          partitionEntry[33],
-                                                          partitionEntry[34],
-                                                          partitionEntry[35],
-                                                          partitionEntry[36],
-                                                          partitionEntry[37],
-                                                          partitionEntry[38],
-                                                          partitionEntry[39]
-                                                          );
-                uint64_t end = RT_MAKE_U64_FROM_U8( partitionEntry[40],
-                                                          partitionEntry[41],
-                                                          partitionEntry[42],
-                                                          partitionEntry[43],
-                                                          partitionEntry[44],
-                                                          partitionEntry[45],
-                                                          partitionEntry[46],
-                                                          partitionEntry[47]
-                                                          );
+
+            if (partitionEntrySize * partitionsNumber > 4 * _1M)
+            {
+                RTMsgError("The GPT header seems corrupt because it contains too many entries");
+                return VERR_INVALID_PARAMETER;
+            }
+
+            uint8_t *pbPartTable = (uint8_t *)RTMemAllocZ(RT_ALIGN_Z(partitionEntrySize * partitionsNumber, 512));
+            if (!pbPartTable)
+            {
+                RTMsgError("Allocating memory for the GPT partitions entries failed");
+                return VERR_NO_MEMORY;
+            }
+
+            /* partition entries begin from LBA2 */
+            /** @todo r=aeichner: Reading from LBA 2 is not always correct, the header will contain the starting LBA. */
+            rc = RTFileReadAt(File, 1024, pbPartTable, RT_ALIGN_Z(partitionEntrySize * partitionsNumber, 512), NULL);
+            if (RT_FAILURE(rc))
+            {
+                RTMsgError("Reading the partition table failed");
+                RTMemFree(pbPartTable);
+                return rc;
+            }
+
+            while (currentEntry < partitionsNumber)
+            {
+                uint8_t *partitionEntry = pbPartTable + currentEntry * partitionEntrySize;
+
+                uint64_t start = RT_MAKE_U64_FROM_U8(partitionEntry[32], partitionEntry[33], partitionEntry[34], partitionEntry[35],
+                                                     partitionEntry[36], partitionEntry[37], partitionEntry[38], partitionEntry[39]);
+                uint64_t end = RT_MAKE_U64_FROM_U8(partitionEntry[40], partitionEntry[41], partitionEntry[42], partitionEntry[43],
+                                                   partitionEntry[44], partitionEntry[45], partitionEntry[46], partitionEntry[47]);
 
                 PHOSTPARTITION pCP = &pPart->aPartitions[pPart->cPartitions++];
@@ -864,4 +869,6 @@
                 ++currentEntry;
             }
+
+            RTMemFree(pbPartTable);
         }
     }
