- //\r
- // BUG: hardcode OldSize == size! We have no any knowledge about\r
- // memory size of original pointer ptr.\r
- //\r
- return ReallocatePool ((UINTN) size, (UINTN) size, ptr);\r
+ CRYPTMEM_HEAD *OldPoolHdr;\r
+ CRYPTMEM_HEAD *NewPoolHdr;\r
+ UINTN OldSize;\r
+ UINTN NewSize;\r
+ VOID *Data;\r
+\r
+ NewSize = (UINTN)size + CRYPTMEM_OVERHEAD;\r
+ Data = AllocatePool (NewSize);\r
+ if (Data != NULL) {\r
+ NewPoolHdr = (CRYPTMEM_HEAD *)Data;\r
+ NewPoolHdr->Signature = CRYPTMEM_HEAD_SIGNATURE;\r
+ NewPoolHdr->Size = size;\r
+ if (ptr != NULL) {\r
+ //\r
+ // Retrieve the original size from the buffer header.\r
+ //\r
+ OldPoolHdr = (CRYPTMEM_HEAD *)ptr - 1;\r
+ ASSERT (OldPoolHdr->Signature == CRYPTMEM_HEAD_SIGNATURE);\r
+ OldSize = OldPoolHdr->Size;\r
+\r
+ //\r
+ // Duplicate the buffer content.\r
+ //\r
+ CopyMem ((VOID *)(NewPoolHdr + 1), ptr, MIN (OldSize, size));\r
+ FreePool ((VOID *)OldPoolHdr);\r
+ }\r
+\r
+ return (VOID *)(NewPoolHdr + 1);\r
+ } else {\r
+ //\r
+ // The buffer allocation failed.\r
+ //\r
+ return NULL;\r
+ }\r