Stricter checks in MemPool::Allocate().

This commit is contained in:
mtheall 2015-03-17 13:49:47 -05:00
parent 7a71787670
commit b30f553dd0

View File

@ -32,18 +32,33 @@ void MemPool::CoalesceRight(MemBlock* b)
bool MemPool::Allocate(MemChunk& chunk, u32 size, int align) bool MemPool::Allocate(MemChunk& chunk, u32 size, int align)
{ {
int alignM = (1 << align) - 1; // Don't shift out of bounds (CERT INT34-C)
u32 newsize; if(align >= 32 || align < 0)
newsize = (size + alignM) &~ alignM; // Round the size return false;
if(newsize < size)return false;//Return error when integer-overflow occurs due to aligning the size.
size = newsize; // Alignment must not be 0
if(align == 0)
return false;
u32 alignMask = (1 << align) - 1;
// Check if size doesn't fit neatly in alignment
if(size & alignMask)
{
// Make sure addition won't overflow (CERT INT30-C)
if(size > UINT32_MAX - alignMask)
return false;
// Pad size to next alignment
size = (size + alignMask) &~ alignMask;
}
// Find the first suitable block // Find the first suitable block
for (auto b = first; b; b = b->next) for (auto b = first; b; b = b->next)
{ {
auto addr = b->base; auto addr = b->base;
u32 begWaste = (u32)addr & alignM; u32 begWaste = (u32)addr & alignMask;
if (begWaste > 0) begWaste = alignM + 1 - begWaste; if (begWaste > 0) begWaste = alignMask + 1 - begWaste;
addr += begWaste; addr += begWaste;
u32 bSize = b->size - begWaste; u32 bSize = b->size - begWaste;
if (bSize < size) continue; if (bSize < size) continue;