Stricter checks in MemPool::Allocate().
This commit is contained in:
parent
7a71787670
commit
b30f553dd0
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user